/ / OCaml: nešpecifikované premenné typu - ocaml

OCaml: nešpecifikované typy premenných - ocaml

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ď č. 1

Jedno 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 "asa 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 termje 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ď.