Je tu vlastne definovať premennú, ktorá zodpovedá akémukoľvek typu v OCaml?
Prišiel som s týmto: type term = Save of "_
po prečítaní tento návod
Ale to nefunguje.
Chyba: Chyba syntaxe
Mohol by mi niekto povedať, prečo mám chybu v kóde vyššie?
odpovede:
3 pre odpoveď č. 1Jedno podčiarknutie _
je skôr operátor (vzor, zvyčajne) akoidentifikátor v OCaml. Takže to je váš problém so syntaxou. Okrem toho názov premennej typu nemôže začať znakom podčiarknutia. Ak chcete zmeniť právny názov "a
sa zobrazia nasledujúce položky:
# type term = Save of "a;;
Error: Unbound type parameter "a
#
Nie je vôbec jasné, čo sa snažíte robiť, ale najpriamejšia definícia, ktorá je podobná tomu, čo dávate, môže byť toto:
# type "a term = Save of "a;;
type "a term = Save of "a
Potom môžete mať hodnoty s akýmkoľvek typom obsahu:
# Save 33;;
- : int term = Save 33
# Save "yes";;
- : string term = Save "yes"
#
Domnievam sa, že sa snažíte robiť niečo lepšie, než je toto, ale ak áno, musíte to vysvetliť opatrnejšie (aspoň pre mňa :-).
4 pre odpoveď č. 2
Každá premenná typu zodpovedá "ľubovoľnému typu" v OCaml. Všetky premenné typu v definícii typu však musia byť viazané, zvyčajne ako parameter:
type "a term = Save of "a
Tu definovaný konštruktor údajov bude mať typ Save : "a -> "a term
, V dôsledku toho v hodnote typu int term
je známe, že konštruktor nesie celé číslo.
Ale ja si "nie som istý, čo sa snažíte dosiahnuť. Možno chcete aj existenčný typ, ktorý" zabudne "typ premennej s inštanciou? Potom musíte použiť syntax GADT:
type term = Save : "a -> term
V tomto prípade bude mať konštruktér údajov typ Save : "a -> term
, Tento typ však nie je obzvlášť užitočný,pretože s argumentom konštruktora nemôžete urobiť nič neskôr, pretože bude úplne abstraktný, keď ho priradíte (pretože to môže byť čokoľvek a neexistuje spôsob, ako povedať, čo je v tomto bode - na rozdiel od typu uvedeného vyššie) Takže bez pochopenia vášho prípadu použitia je ťažké dať lepšiu odpoveď.