【发布时间】:2015-01-23 09:25:38
【问题描述】:
我正在练习 Haskell 99 questions。
问题 8
消除列表元素的连续重复。
如果列表包含重复的元素,则应将其替换为 元素的单个副本。元素的顺序不应该是 改变了。
Haskell 中的示例:
> compress "aaaabccaadeeee" "abcade"
我无法理解这个解决方案:
compress xs = foldr f (const []) xs Nothing
where
f x r a@(Just q) | x == q = r a
f x r _ = x : r (Just x)
foldr 接受三个参数。第一个参数是函数(a -> b -> b)。第二个是初始累加器,第三个是列表。
(const []) 是传递给foldr 的第二个参数吗?
函数f :: Eq a => a -> (Maybe a -> [a]) -> Maybe a -> [a] 采用三个参数,与foldr 的预期不符。传入了什么值?
最后一个Nothing是干什么用的?
【问题讨论】:
-
我也很难理解这个问题。我的猜测是
foldr正在构建并返回一个函数,然后Nothing是该函数的输入...... -
@MathematicalOrchid 听起来不错。
f的类型签名帮助:f :: Eq a => a -> (Maybe a -> [a]) -> (Maybe a -> [a])。
标签: haskell