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