我不确定我的标题是否真的描述了我所追求的内容,所以我首先要展示一段代码:
data IntegralExpression= Value Integer
| Add IntegralExpression IntegralExpression
deriving Show
data BooleanExpression = BValue Bool
| And BooleanExpression BooleanExpression
| Or BooleanExpression BooleanExpression
deriving Show
data ParentExpression = BooleanExpression
| IntegralExpression
deriving Show
我设置它的方式,对我来说,ParentExpression可以是IntegerExpression或BooleanExpression是有道理的。但是,我正在尝试完成一个具有ParentExpression作为输入的函数,它可以(例如)为'Value 5'(来自IntegerExpression子类)。但是在编译时,它会说它需要ParentExpression而不是IntegerExpression。如何创建一个评估任何孩子的一般“父母”?
我的功能(为简单起见)看起来像这样:
testConvert :: ParentExpression -> Integer
testConvert (Value n) = n
在我看来,这个函数应该“理解”这涉及到IntegralExpression,因为我打电话:
testConvert (Value 5)
但是,它不会编译,因为Haskell期望某种类型的'ParentExpression',而我输入'IntegralExpression'。
所以我的问题是:如何创建一个父数据类型作为其类型的函数,它接受其子项的任何形式的输入?
答案 0 :(得分:10)
data ParentExpression = BooleanExpression | IntegralExpression
不会做你认为它正在做的事情。它的作用是声明一个带有两个nullary构造函数的新数据类型,它与前面声明的类似命名的数据类型没有任何共同之处。
在创建新数据类型时,您需要始终指定构造函数名称,例如
data ParentExpression = BExpr BooleanExpression | IExpr IntegralExpression
在Haskell中,所有值都使用其数据类型构造函数显式“标记”,例如:
testConvert :: ParentExpression -> Integer
testConvert (IExpr (Value n)) = n
Haskell中没有隐式类型转换。