Импрессивный полиморфизм в F #

Система типа OCaml Hindley-Milner не допускает неспецифического полиморфизма (à la System-F), за исключением нескольких недавних расширений для типов записей. То же самое относится к F #.

Однако иногда желательно перевести программы, написанные с помощью непроизводительного полиморфизма (например, Coq) на такие языки. Решение для экстрактора Coq для OCaml должно (экономно) использовать Obj.magic, что является своего рода универсальным небезопасным литьем. Это работает, потому что

  • в системе времени исполнения OCaml, все значения имеют одинаковый размер независимо от их типа (32 или 64 бита в зависимости от архитектуры).
  • более сложная система типов, применяемая к исходной программе, гарантирует безопасность типа.

Можно ли сделать что-то подобное в F #?

Ответ 1

Было бы полезно, если бы вы могли уточнить, чего именно вы хотели бы достичь. Некоторые нецелесообразные применения (такие как этот пример из вики Haskell) относительно легко кодировать с использованием дополнительного номинального типа с помощью одного общего метода:

type IForallList =
    abstract Apply : 'a list -> 'a list

let f = function
| Some(g : IForallList) -> Some(g.Apply [3], g.Apply ("hello" |> Seq.toList))
| None -> None

let rev = { new IForallList with member __.Apply(l) = List.rev l }

let result = f (Some rev)