2011-12-16 14 views
2

さまざまな値と名前を持つことができるMercuryでデータ型を宣言したいと思います。たとえば、無制限変数名の宣言

type goal ---> pick; give; come. 

には3つの変数/値があります。変数の数が制限されたり固定されていないことを

type myplayer ---> de value declaration here. 

は、私のような何かをしたいです。

v1, v2, v3 and v4.のような値/変数を宣言するためにmyplayerを使用することができます.2度目は、a, b, c, d, e, z, aa, ab and azのようなdelcareに使用できます。

値の数に制限はなく、名前も固定されていません。

新しい水銀ですので、私はいくつかの助けが必要です。

ありがとうございました

+0

あなたは「第二の時間」とはどういう意味ですか?myplayerを再定義するか、2回目の使用で値の別のサブセットを使用することを意味しますか?また、より大きなコンテキストは何ですか?パラメトリック型やtypeclassが必要なように聞こえますが、コンテキストなしではわかりません。 –

答えて

1

あなたが直接尋ねるものは、簡単に行えません。

answer(truth(_, yes)) = "true". 
answer(truth(_, no)) = "false". 
answer(blank(_, A)) = A. 
answer(multiple(_, A, _)) = A. 
のような以前に決定論的コードとして、あまりにも、そして他の多くの変更を行う - 質問の

:- type question 
     ---> truth(string, bool) 
     ;  blank(string, string) 
     ;  multiple(string, string, list(string)). 

追加の種類だけ、それが定義されているこのタイプを拡張し、モジュールを再コンパイルすることによって追加することができます与えられましたあなたの新しい質問タイプが与えられたら、

が失敗します。コンパイル時に、プログラムの更新に失敗して、「すべての選択肢を選ぶ」タイプの質問を追加したことを伝えることは、あなたが質問タイプを持っている理由の良い部分です。あなたの質問の銀行のためのストリングのリスト[["Are foxes pretty?", "true"], ["Green foxes are ____", "adorable!", "fake", "evidence of animal cruelty"]]の代わりに。

あなたが求めるものはできません。しかし、あなたが実際にやりたいこと、つまり「可変数の型」が有益な手段となると思われる終わりは、確かに他の方法で達成することができます。私はあなたがあなたの質問からこれをやりたがっている理由を私には伝えられないので、それがどういう意味であるかはわかりません。おそらく、言語リファレンスでdiscriminated unionsまたはtypeclassesを読んで恩恵を受けるかもしれません。

+2

該当しません。述部が失敗するのを防ぐために、文字列型の特定のインスタンスを宣言できます。例えば: - inst foo == bound( "x"; "y"; "z")。 : - func bar(string :: in(foo))=(int :: out)はdetです。それは*奇妙な*ですが、それはOPが望んでいる(私は思う)を達成するだろうと考えています。 –

2

他の人からも言われているように、これは水銀では不可能です。これは意図的です。あなたが表現するタイプたい場合は、しかし場合がありますどのような

:- type my_type 
    ----> v(int). 

:- func name(my_type) = string. 

name(v(Num)) = formst("v%d", [i(Num)]). 

タイプは、すべての整数のVを表し、関数名をするために使用することができます:V1、V2、V3 ...などがありますこのタイプの 'pretty-print'値。

1

私はこの質問を理解しています。 Prologのような振る舞いが必要です。つまり、型付きの述語はありません。静的型付きシステムでは、それを自分で処理することによって、常にそのような振る舞いを実現することができます。多くの時間前、私はTurbo Prologのような例を見ました(彼らはTurbo/Visual Prologに関してISOプロローグを実装しました)。

は(私はそれが正しいかはわからない)のようなものを考えてみましょう:

:- type any_type ---> atom_value(string) 
       ; number_value(int) 
       ; struct_value(any_type, list(any_type)). 

guess(atom_value("v1")). 
guess(atom_value("a")). 
guess(atom_value("aa")). 
guess(number_value(42)). 
guess(struct_value(atom_value("pair"), [number_value(3), number_value(4)])).