【发布时间】:2014-08-22 13:26:51
【问题描述】:
Data.List 定义
unfoldr :: (b -> Maybe (a, b)) -> b -> [a]
unfoldr f b = case f b of
Just (a,new_b) -> a : unfoldr f new_b
Nothing -> []
有许多函数几乎可以使用unfoldr 定义,但在列表的最后会遇到问题。一个简单的“修复”是
unfoldr' :: (b -> Either (a,b) [a]) -> b -> [a]
unfoldr' f b = case f b of
Left (a, new_b) -> a : unfoldr' f new_b
Right r -> r
这个函数有标准名称吗?它是否具有良好的属性并与foldr 很好地交互?
【问题讨论】:
-
有什么例子可以说明用
unfoldr很难定义但用unfoldr'很容易定义的函数? -
@amalloy,考虑
f xs = zip (map reverse $ inits xs) (tails xs)。 -
如果
b是Either,则可以根据unfold实现unfoldr'。 -
@GabrielGonzalez,这是一个很好的观点。你认为它会同样有效吗?
-
它让我想起了一些我称之为
generalFold的东西:pastebin.com/r7jdBVDM(这不是我的粘贴箱,但我认为这是我的generalFold的代码现在唯一在线的地方)。Left和Right与您必须利用Eithermonad 的内容相反,它也更类似于在典型的unfoldr中使用Maybe的方式(Nothing和Left ...传统上表示失败,因此它们对应于终止)。
标签: haskell