Импрессивный полиморфизм в 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)