我有一些 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/