我如何确定一个孩子'从父母的数据类型中输入?

时间:2015-04-09 12:45:39

标签: haskell ghci

我不确定我的标题是否真的描述了我所追求的内容,所以我首先要展示一段代码:

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'。

所以我的问题是:如何创建一个父数据类型作为其类型的函数,它接受其子项的任何形式的输入?

1 个答案:

答案 0 :(得分:10)

data ParentExpression = BooleanExpression | IntegralExpression

不会做你认为它正在做的事情。它的作用是声明一个带有两个nullary构造函数的新数据类型,它与前面声明的类似命名的数据类型没有任何共同之处。

在创建新数据类型时,您需要始终指定构造函数名称,例如

data ParentExpression = BExpr BooleanExpression | IExpr IntegralExpression

在Haskell中,所有值都使用其数据类型构造函数显式“标记”,例如:

testConvert :: ParentExpression -> Integer
testConvert (IExpr (Value n)) = n

Haskell中没有隐式类型转换。