如何根据 parent 的数据类型确定 'child' 类型?

How do I determine a 'child' type from a parent's data type?

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

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 child class)。但是在编译时,它会说它需要一个 ParentExpression 而不是一个 IntegerExpression。我如何创建 1 个通用 'parent' 来评估任何 child?

我的函数(为简单起见)如下所示:

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

在我看来,这个函数应该 'understand' 这涉及到我调用的 IntegralExpression:

testConvert (Value 5)

但是,它不会编译,因为 Haskell 需要类型 'ParentExpression' 而我输入 'IntegralExpression'.

所以我的问题是: 我怎样才能创建一个以 parent 数据类型作为类型的函数,它接受其 [=34= 的任何形式的输入]s?

data ParentExpression = BooleanExpression | IntegralExpression

并不像您认为的那样。它的作用是声明一个具有两个 nullary 构造函数的新数据类型,这与之前声明的类似命名的数据类型没有任何共同之处。

在创建新的数据类型时,您总是需要指定一个构造函数名称,例如

data ParentExpression = BExpr BooleanExpression | IExpr IntegralExpression

在 Haskell 中,所有值都明确 "tagged" 及其数据类型构造函数,例如:

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

Haskell.

中没有隐式类型转换