2016-11-25 23 views
0

作業:型鋳造私は定義された次のようなデータ構造を持つネストされたデータ構造で

data Operator = Plus | Times | Minus deriving (Eq,Show) 
data Variable = A | B | C deriving (Eq,Show) 
newtype Const = D Numeral deriving (Eq,Show) 
data CVO = Const | Variable | Operator deriving (Eq,Show) 
type Expr = [CVO] 

私は次の関数定義されている:私はの要素かどうかを確認したいと思います

eval2 :: Expr -> Integer 
eval2 x = helper x 

をCVOリスト(Expr)はConst、Variable、Operatorのいずれかのインスタンスであり、インスタンスの特定のタイプ(たとえば、Plus、Times、Minus for Operator)のさまざまなコードを実装したいと思います。

helper :: Expr -> Integer 
helper [] = 2 
helper (x:xs) 
    | x == Operator && x == Plus = 1 

xは、CVOタイプであると予想されるため、xとプラスを比較することはできません。

Couldn't match expected type ‘CVO’ with actual type ‘Operator’ 

比較を行うためにxをキャストしてオペレータのインスタンスにすることはどういうことですか?

答えて

2

値は同時に2つの異なるタイプを持つことはできません。 xCVOの場合は、==PlusOperator)と比較することはできません。タイプCVOConstVariableOperatorと呼ばれる3つの定数値から成る瞬間

。私はあなたが実際にそれがConstVariableまたはOperatorのタイプの値を含むことを望んでいたと思います。あなたはコンストラクタへの引数を宣言することでそれを行います。

data CVO = Const Const -- a constructor whose name is Const and contains a value of type Const 
     | Var Variable -- a constructor named Var containing a Variable 
     | Op Operator -- a constructor named Op containing an Operator 

タイプCVOの与えられた値は、正しいタイプの値を含むこれら3つのコンストラクタのいずれかから構築されていなければなりません。 CVOの作成に使用されたコンストラクタをテストし、のパターンマッチングを使用して値をアンパックすることができます。このようなもの:

helper :: Expr -> Integer 
helper [] = 0 
helper (Op o:xs) -- because we matched Op, we know o :: Operator 
    | o == Plus = 1 
    | otherwise = 2 
helper _ = 3 
+0

ありがとうございました!意味あり。 – Alexander

関連する問題