Function 我不明白这个haskell代码是怎么回事

Function 我不明白这个haskell代码是怎么回事,function,haskell,types,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的包装器,它获取该包中泛型对象的数量。但我真的不明白过去的一切。如何修改包中的内容?还

我有一些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的包装器,它获取该包中泛型对象的数量。但我真的不明白过去的一切。如何修改包中的内容?还是袋子本身?从我的想法来看,加在袋子里会是

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

但是当add函数需要返回一个包时,它会返回一个int。有人能给我解释一下这是怎么回事吗?

术语和讨论

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

emptyB :: Bag a
emptyB = \e -> 0
从任何类型到常量零的函数

countB :: Eq a => Bag a -> a -> Int
countB b e = b e
简而言之,这只是一个函数应用程序。将名为
b
的函数应用于输入
e

为了乐趣和学习而重写

我很欣赏你可以用函数来模拟结构——这是一个常见的编程语言类赋值。您可以将一个
袋子a
和另一个
袋子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

,可能是因为类型名称“Bag”而假设得太多了。尝试用
类型函数a=a->Int
而不是
Bag
重写它。然后尝试内联所有内容-无论您当前在哪里看到
Bag a
都将其替换为
a->Int
。你现在对这个问题怎么看?不幸的是,我还是不太明白,我也不太清楚到底发生了什么。将其重写为函数而不是包会让我更加困惑如何返回函数对象而不是Int,因为这似乎是我唯一能弄明白的事情--认识到
countB
可以重写为
countB=\e->be
addB bag x y=(如果x==y,则1否则0)你做得对,我被留在这个班上,这让我很痛苦。这篇文章很有帮助,谢谢!