Spróbuj lepiej zrozumieć interfejs / moduł OCaml
Rozumiem w OCaml są koncepcjeinterfaces
imodule
.
I rozumiem, jak z nich korzystać teraz.
Nie rozumiem jednak, jak je w pełni wykorzystać.
Na przykład w Javie powiedzmy, że mamy interfejsMap
i my też mamyHashtable
iHashMap
to narzędzieMap
.
W kodzie mogę to zrobić:
Map m = new Hashtable();
m.put("key", value);
Kiedyś, jeśli zmienię zdanie, mogę się zmienićHashmap
bardzo szybko zmieniającMap m = new Hashtable();
doMap m = new HashMap();
, dobrze?
Ale jak mogę to łatwo zrobić w Ocaml?
Na przykład mamMapSig
i „HashMap: MapSigand "Hashtable:MapSig
w OCaml.
Jak mogę łatwo zmienić implementację?
Myślę, że nie mogę, ponieważ w OCaml muszę zrobić:
let m = Hashtable.create ();;
Hashtable.put m key value;;
jeśli chcę użyćHashMap
zamiast tego muszę wymienić każdyHashtable
zHashMap
w kodzie, prawda?
Nie szukam tylko sposobu na utworzenie aliasu do modułów. Rozważam również ważność implementacji, tj. Czy implementacja podąża za pożądanym interfejsem.
Na przykład w powyższym przykładzie Java tylko wtedy, gdyHashMap
zaimplementowałMap
interfejs, mogę wymienićHashtable
zHashMap
. w przeciwnym razie kompilator Java narzeka.
ale jeśli to zrobięmodule M = Hashtable
w OCaml i jeśliHashMap
nie następujeMapSig
i zastępujęHashtable
zHashMap
, co się stanie? Myślę, że kompilator nie narzeka, prawda?