2016-11-25 73 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與Plus進行比較,因爲它期望x是類型CVO。

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

是它在某種程度上可以投X是運營商的一個實例,以做比較呢?

回答

2

一個值不能同時有兩種不同的類型。如果xCVO,則不能使用==將其與Plus比較,該值爲Operator

目前類型CVO由三個稱爲ConstVariableOperator常數值的。我猜你實際上希望它包含ConstVariableOperator類型的值。你通過向構造函數聲明參數來做到這一點。

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類型的給定值必須已經從那些三個構造的一個內置,含有正確類型的值。您可以測試使用哪個構造函數創建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