4

宿題では、論理演算子を次のように定義する必要があります。
このデータ構造の使用:

data MyBool = Cierto|Falso deriving (Show,Eq) -- Cierto = True and Falso = False
data PQR = A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z deriving (Show,Eq)
data Formula = VarProp PQR 
             |Neg Formula -- logic not
             |Formula :|: Formula -- logic or
             |Formula :&: Formula -- logic and... etc
             |Formula :->: Formula
             |Formula :<->: Formula deriving (Show,Eq)

そして、与えられた数式がTrueかFalseかを教えてくれる関数を定義する必要があるので、たとえば、私が書く場合(Cierto :&: Falso)、答えは次のようになりますFalso

私の先生によると、この場合は関数を呼び出す必要があり、型:&:を受け取るMyBool必要があるため、次のように実装しようとしました。

infixr 3 :&:
(:&:) :: MyBool -> MyBool -> MyBool
Cierto :&: x = x
Falso :&: x = Falso

しかし、私がそれをロードしようとすると、それは言います:

Invalid type signature

ここで何が間違っているのかわかりません。

4

2 に答える 2

5

教授は、ブール演算子の抽象構文ツリー (AST) を作成するように強制しています。これより前に「抽象構文ツリー」という言葉を聞いたことがない場合は、一体何が起こっているのか誰かに尋ねる時が来ました。

実際にやりたいことはeval、 type で関数 ( say と呼ばれる) を書くことですFormula -> Formuladata Formula定義を見ると、次のような行が抜けていると思いVarLiteral MyBoolます。あなたのASTは、で動作するプログラムを作成する方法であり、代入(?)MyBoolとともに典型的なブール演算をサポートしているようです。:->:

私は Haskell でいくつかの AST エバリュエーターを書きました (ただし、これほど陳腐なものはありません :) )。目の前にあることを踏まえて、あなたへの私の最善のアドバイスは、この課題はあなたが思っているよりも 1 レベル抽象的であると言うことです。

幸運を祈ります

于 2011-12-05T07:25:43.607 に答える
5

問題は:、関数の前にある a がデータ コンストラクターを表すことです。大文字で始めるようなものです。:&:のような名前に変更する必要があり|&|ます。

編集:気にしないで、あなたが実際に達成しようとしていることを理解しました。

:&:2 つの を取り、別の ではなくMyBoolを作成することになっています。を関数として実装しようとしました。それはデータコンストラクタです。すでに式で宣言しています。FormulaMyBool:&:data Forumla = ...

関数宣言はまったく必要ありません。次のコード ブロックを完全に削除します。

infixr 3 :&:
(:&:) :: MyBool -> MyBool -> MyBool
Cierto :&: x = x
Falso :&: x = Falso

:&:その後、 を使用して 2 つの を取り、他のコードを追加せずに をMyBool作成できるはずです。Formula

ただし、:&:実際に s に作用することMyBoolは一般的ではありません。式とブール値の両方を一緒にできるようにしたいと考えています。したがって、実際には s:&:を結合する必要がありますFormula。これは、あなたのコードがすでに行っていることです。あなたが欠けているのは、そのブール値を表すLiterala を取り、MyBool返すようなコンストラクタです。Formula

于 2011-12-05T06:38:11.350 に答える