Myślę, że definiowanie typu tylko przy użyciu type somename
nie będzie działać w F #. Kompilator F # musi wygenerować pewien typ .NET z deklaracji, a specyfikacja F # nie definiuje jednoznacznie, co powinno się stać w przypadku typów fantomowych.
Można utworzyć typ betonu (np. Z type somename = ReadOnlyDummyValue
) w pliku implementacji (.fs) i ukryć elementy wewnętrzne typu, dodając tylko type somename
do pliku interfejsu (.fsi). W ten sposób stajesz się bliski typowi widma - użytkownik spoza tego pliku nie zobaczy wewnętrznych elementów tego typu.
Inną interesującą alternatywą byłoby użycie interfejsów. Brzmi to dla mnie logicznie, ponieważ pusty interfejs jest prawdopodobnie najprostszym typem, który można zadeklarować (i nie wprowadza żadnych fałszywych identyfikatorów). Pusty interfejs wygląda tak:
type CanRead = interface end
type CanWrote = interface end
Co ciekawe, w tym przypadku, jest to, że można również tworzyć odziedziczone interfejsy:
type CanReadWrite =
inherit CanRead
inherit CanWrite
Następnie można napisać funkcję, która może przyjmować wartości typu Ref<CanRead, int>
ale także wartości typu Ref<CanReadWrite, int>
(ponieważ wartości te obsługują również odczyt):
let foo (arg:Ref<#CanRead, int>) = // ...
To wydaje się jak coś, które mogłyby być u seful. Byłbym całkiem zainteresowany, czy można to zrobić również w OCaml (ponieważ opiera się na obsłudze F # dla interfejsów i dziedziczenia).
Czy znasz http://blog.matthewdoig.com/?p=134 i http://blog.matthewdoig.com/?p=138? –
Dzięki za linki. Jakoś tęskniłem za nimi. –
Blog matthewdoiga jest martwy, ale artykuły znajdują się na archive.org: http://web.archive.org/web/20100615031828/http://blog.matthewdoig.com/?p=134 http: //web.archive .org/web/20100615031841/http: //blog.matthewdoig.com/? p = 138 –