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

标签 haskell haskell-stack

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

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

data Euro = MkEuro Integer Integer
data Dollar = MkDollar Integer Integer
data Yen = MkYen Integer
data Currency = Euro | Dollar | Yen

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

Couldn't match expected type `Currency' with actual type `Dollar'

遗憾的是,我必须使用货币类型,并且无法为所有三种货币创建不同的函数。

最佳答案

目前,您的货币被构造为三个值,不带任何参数。因此,Euro 是一个值,Dollar 是一个值,Yen 是一个值,但 MkYen 15 不是。

您可以向数据构造函数添加参数,例如:

data Currency = Euro <b>Euro</b> | Dollar <b>Dollar</b> | Yen <b>Yen</b>

然后您可以使用以下方式构建货币:

<b>Euro</b> (MkEuro 14 25) :: Currency

::货币不是必需的。因此,MkEuro 将构造一个 Euro 类型的对象,然后我们使用类型为 Euro data 的构造函数欧元 -> 货币 构建货币

Sadly I have to use the type Currency and can't create different functions for all three currencies.

您可能想要创建一个 Currency typeclass,它提供一个接口(interface)来说明货币应实现哪些功能,然后创建 EuroDollarYen 该类型类的实例。

关于haskell - 如何定义由其他数据类型组成的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58780928/

相关文章:

do block 内的Haskell where子句语法

haskell - 这个数据是什么......试图完成的地方? ( haskell )

haskell - 在NixOS中构建Haskell Stack示例时出现“ghc-cabal:无此文件或目录”错误

haskell - 在 Haskell 中从 IO 中获取元素

haskell - Haskell 中的 floor 和 truncate 有区别吗

haskell - 为什么 Haskell 没有单个元素元组?

haskell - 是否应该将 stack.yaml.lock checkin 源代码管理?

haskell - 我在哪里定义任意实例?

haskell - 在 Gitlab CI 中的构建之间缓存堆栈数据库

haskell - 如何将环境变量传递给通过堆栈运行的 Haskell 程序?