gpt4 book ai didi

Haskell - Bags - 如何在 Haskell 中使用多态性?

转载 作者:行者123 更新时间:2023-12-02 02:06:47 27 4
gpt4 key购买 nike

我刚刚开始学习 Haskell,但还没有掌握函数式编程。我需要创建一个多态数据类型,在运行我编写的函数之一之前我不知道其类型。该程序似乎希望我从列表中构建元组列表,例如:

['Car', 'Car', 'Motorcycle', 'Motorcycle', 'Motorcycle', 'Truck'] 将转换为 [('Car', 2) , ('摩托车', 3), ('卡车', 1)].

在同一个元组列表(一个包)中,所有元素都具有相同的类型,但不同的包可能包含其他类型。现在,我的数据类型声明(我不确定它在 FP 中是否称为“声明”)如下:

type Amount = Int
data Bag a = [(a, Amount)]

但是,当我尝试加载模块时,出现此错误:

Cannot parse data constructor in a data/newtype declaration: [(a, Amount)]

如果我在声明中将 data 更改为 type,我会收到所有函数的错误消息:

Expecting one more argument to ‘Bag’
Expected a type, but ‘Bag’ has kind ‘* -> *’

关于 FP 有什么我不明白的地方还是代码错误?更重要的是,我如何以实际上允许我将模块加载到 GHCi 中的方式声明这一点?

最佳答案

定义数据类型

这与函数式编程本身无关。如果你定义一个data类型(或newtype),在Haskell中它需要一个数据构造函数(对于newtype)只能是一个数据构造函数,并且带有一个参数)。然而,[(a, Amount)] 对于数据构造函数来说不是一个好的“名称”(好吧,无论如何你都不打算将其用作数据构造函数)。

我们可以在这里编写一个数据构造函数,例如:

data Bag a = <b>Bag</b> [(a, Amount)]

由于这里 Bag 包含(可能)一个带有一个参数的数据构造函数,我们可以将其设为一个 newtype:

<b>newtype</b> Bag a = Bag [(a, Amount)]

但是上述内容可能不是必需的:您可能希望使用 type 声明类型别名:

<b>type</b> Bag a = [(a, Amount)]

在这种情况下,你没有构造一个新类型,但是你可以写Bag a,并且“在幕后”,Haskell将用替换它>[(a,金额)]

使用Bag定义函数

如果您现在想要定义一个处理 Bag 的函数,您还需要在签名中指定参数 a,例如:

count :: Eq a => [a] -> Bag <b>a</b>
count = -- ...

现在很明显,我们在 aBag 中转换 a 列表。

关于Haskell - Bags - 如何在 Haskell 中使用多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52843680/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com