function - 不明白这个 haskell 代码中的内容

标签 function haskell types

我有一些 haskell 代码,我正在尝试按照自己的方式工作,但我不明白其中发生了什么。

type Bag a = a -> Int

emptyB :: Bag a
emptyB = \e -> 0

countB :: Eq a => Bag a -> a -> Int
countB b e = b e

据我了解,Bag 类型是一个接受通用对象并返回 Int 的函数,而 countB 基本上是 Bag 的包装器,用于获取该 Bag 中通用对象的数量。但除此之外我真的不明白任何事情。如何修改包里的元素?还是包本身?据我所知,添加到袋子里会是这样的

addB :: Eq a => Bag a -> a -> Bag a
addB bag num = bag (num+bag) 

但是当 add 函数需要返回一个 bag 时,它会返回一个 int。谁能向我解释一下这是如何工作的?

最佳答案

条款和讨论

type Bag a = a -> Int

这里Bag不是一个对象。它只是一种类型 - a -> Int 的别名。如果您有一个 a 类型的值,它将计算并返回一个 Int 类型的值。就是这样。没有 Bag,没有可以添加东西的结构。最好不要称其为包。

emptyB :: Bag a
emptyB = \e -> 0

从任意类型到常量零的函数。

countB :: Eq a => Bag a -> a -> Int
countB b e = b e

简而言之,这只是函数应用。将名为 b 的函数应用于输入 e

为了乐趣和学习而重写

我很欣赏您可以使用函数来模仿结构 - 这是一种常见的编程语言类作业。您可以采用一个 Bag a 和另一个 Bag a,然后将它们合并,例如通过添加两个单独袋子的计数来返回一个新的 countB - 酷。

...但这似乎太多了。在继续你的作业之前(我猜对了吗?),你可能应该对基础知识稍微熟悉一些。

如果您重写不带类型别名的函数可能会更容易:

emptyB :: a -> Int
emptyB = \e -> 0
-- or: emptyB e = 0
-- or: emptyB _ = 0
-- or: emptyB = const 0

无论有没有包,它只是一个功能。

countB :: Eq a => (a -> Int) -> a -> Int
countB b e = b e

接受 a 并生成 Int 的函数可以...被赋予一个值(变量 e 的类型为 a) 并生成一个 Int

关于function - 不明白这个 haskell 代码中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54995025/

相关文章:

c - 在函数C中分配内存二维数组

c - 是否可以从目标文件中提取函数签名?

python - 在按钮游戏功能中插入分数

c++ - 函数重载和模板

linux - 尝试安装 HGL,X11 错误

java - 我可以在 Java 中定义 Negatable 接口(interface)吗?

algorithm - 求和树的高效折叠

string - golang 将 "type []string"转换为字符串

SQL Server十进制变量分配?

Python 自定义数值类型 : Wrap around number