如何从父数据类型中确定"子"类型?

Khe*_*ran 3 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
Run Code Online (Sandbox Code Playgroud)

我设置它的方式,对我来说,ParentExpression可以是IntegerExpression或BooleanExpression是有道理的.但是,我正在尝试完成一个具有ParentExpression作为输入的函数,它可以(例如)为'Value 5'(来自IntegerExpression子类).但是在编译时,它会说它需要ParentExpression而不是IntegerExpression.如何创建一个评估任何孩子的一般"父母"?

我的功能(为简单起见)看起来像这样:

testConvert :: ParentExpression -> Integer
testConvert (Value n) = n
Run Code Online (Sandbox Code Playgroud)

在我看来,这个函数应该"理解"这涉及一个IntegralExpression,因为我调用:

testConvert (Value 5)
Run Code Online (Sandbox Code Playgroud)

但是,它不会编译,因为Haskell期望某种类型的'ParentExpression',而我输入'IntegralExpression'.

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

Wil*_*ess 10

data ParentExpression = BooleanExpression | IntegralExpression
Run Code Online (Sandbox Code Playgroud)

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

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

data ParentExpression = BExpr BooleanExpression | IExpr IntegralExpression
Run Code Online (Sandbox Code Playgroud)

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

testConvert :: ParentExpression -> Integer
testConvert (IExpr (Value n)) = n
Run Code Online (Sandbox Code Playgroud)

Haskell中没有隐式类型转换.