如何定义由其他数据类型组成的数据类型?

jon*_*nas 2 haskell haskell-stack

我想定义数据类型Currency,它由其他三个数据类型组成。我有一个问题,Haskell无法将数据类型识别为货币的一部分,这破坏了一切。

我的想法是将不同的货币定义为它们自己的数据类型,然后将它们添加到“货币”类型,我尝试使用:

data Euro = MkEuro Integer Integer
data Dollar = MkDollar Integer Integer
data Yen = MkYen Integer
data Currency = Euro | Dollar | Yen
Run Code Online (Sandbox Code Playgroud)

如果要在任何函数中使用货币类型,则会得到以下错误消息的变体:

Couldn't match expected type `Currency' with actual type `Dollar'
Run Code Online (Sandbox Code Playgroud)

可悲的是,我必须使用货币类型,并且不能为所有三种货币创建不同的功能。

Wil*_*sem 5

当前,您Currency将构造为三个不带参数的值。因此Euro,值Dollar是,是值,并且Yen是值,但不是MkYen 15。

您可以将参数添加到数据构造函数中,例如:

data Currency = Euro Euro | Dollar Dollar | Yen Yen
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用构造一个Currency:

Euro (MkEuro 14 25) :: Currency
Run Code Online (Sandbox Code Playgroud)

该:: Currency是没有必要的。因此,MkEuro会构造一个Euro类型的对象,然后我们使用具有类型的Euro 数据构造Euro -> Currency函数构造一个Currency。

可悲的是,我必须使用该类型Currency,并且不能为所有三种货币创建不同的函数。

你可能想使一个Currency 类型类然而,规定说什么功能的货币应该实现一个接口,然后进行Euro,Dollar以及Yen该类型类的实例。