【发布时间】:2021-02-02 17:23:15
【问题描述】:
data LinkedList a = Empty | Cons a (LinkedList a) deriving (Eq, Show)
instance Foldable LinkedList where
foldMap _ Empty = mempty
foldMap f (a `Cons` ll) = LinkedList (f a) (foldMap f ll)
似乎 LinkedList 构造函数不在范围内?为什么?
编译错误:
Data constructor not in scope: LinkedList :: m -> m -> m
|
17 | foldMap f (a `Cons` ll) = LinkedList (f a) (foldMap f ll)
| ^^^^^^^^^^
我搜索了一个解决方案,似乎我应该使用“映射”而不是构造函数。这非常令人困惑。我没有在任何地方定义任何 Monoid 类型类。
你能解释为什么mappened 而不是构造函数吗?以及Monoid 函数mappened 和mempty 是在哪里定义的?
编辑 ---------------------------------------------- ----------------------
当我从 mappened 改回来时,我犯了一个错误。抱歉,正确的问题是:
instance Foldable LinkedList where
foldMap _ Empty = mempty
foldMap f (a `Cons` ll) = Cons (f a) (foldMap f ll)
编译器错误:
• Occurs check: cannot construct the infinite type:
m ~ LinkedList m
• In the second argument of ‘Cons’, namely ‘(foldMap f ll)’
|
17 | foldMap f (a `Cons` ll) = Cons (f a) (foldMap f ll)
|
^^^^^^^^^^^^
为什么我不能递归地使用 foldMap?以及 Monoid 函数的定义位置。
【问题讨论】:
-
你没有
LinkedList数据构造函数,只是一个同名类型。类型和值(包括数据构造函数)存在于完全不同的命名空间中,即使两者都是大写的。 -
你需要注意你的拼写。你可以(有时)在这里逃脱;您正在编程的计算机将不那么乐于助人。
-
至于为什么需要
mappend,那是因为对foldMap的递归调用会返回一个任意Monoid 中的值——所以mappend(连同mempty)是唯一的东西你“知道”你有。 -
@RobinZigmond 抱歉,我更正了这个问题。
标签: haskell constructor typeclass monoids