【发布时间】:2020-10-01 12:20:10
【问题描述】:
在学校,我的任务是编写一个函数,将数字附加到列表的左侧,如果它们是偶数的话。类型签名为:
appendIfEven :: (Applicative f, Monoid (f a), Integral a) => a -> f a -> f a
我的答案是下面这段代码
appendIfEven :: (Applicative f, Monoid (f a), Integral a) => a -> f a -> f a
appendIfEven x ms = if x `mod` 2 == 0 then mempty x `mappend` ms else ms
Haskell 可以编译我的代码,但它不能正常工作。经过一些实验,我将 mempty 切换为 pure :
appendIfEven :: (Applicative f, Monoid (f a), Integral a) => a -> f a -> f a
appendIfEven x ms = if x `mod` 2 == 0 then pure x `mappend` ms else ms
效果很好。但为什么 ?不应该 pure == mempty 吗? (在这种情况下) 这对我的导师来说似乎并不重要。但是我真的很想了解更多关于 Haskell 以及我错在哪里......
【问题讨论】:
-
它们有不同的类型,其中之一。如果它们有不同的类型,它们怎么可能是一样的呢?
-
它编译是因为
a -> b有一个Monoid实例只要b也是一个Monoid,在这种情况下mempty = const mempty。 -
@user253751
a -> b有一个Monoid实例,在这种情况下mempty本身也是一个函数。
标签: haskell applicative monoids