[英]Implementing tails using foldr in Haskell
所以今天早些时候我问过通过foldr实现inits 。 我现在有类似的尾巴问题。 首先要做的是:我有一个解决方案。 然而,这不是我需要的解决方案,而是我应得的解决方案。 或类似的东西:
码:
tails :: [a] -> [[a]]
tails = foldr ( \ x y -> reverse([] : reverse(map (x:) y) )) [[]]
这提供了正确的结果,但它不符合我们的教授为我们设定的模式。 模式看起来像这样:
tails :: [a] -> [[a]]
tails = foldr ( \ x y -> undefined : undefined ) undefined
所以显然我的功能需要调整,但是我不会理解它,因为我总是回到我的解决方案。
如何更好地解决这个问题的任何提示?
提前致谢。
解决了:
tails :: [a] -> [[a]]
tails = foldr ( \ x y -> (x : (head y)) : y) [[]]
一些提示:
你知道tails [] == [[]]
,所以你的初始值必须是[[]]
,所以你会有
tails = foldr (\\xy -> undefined : undefined) [[]]
length (tails xs !! n) > length (tails xs !! (n+1))
,或者用简单的英语:当你沿着列表向下时,每个尾部的长度变短。
你怎么看待foldr (\\x (y:ys) -> undefined : undefined) [[]]
?
如果你再次陷入困境(或者已经考虑过这些),请留言,我会给你另一个推动。
旁注,我觉得这个网站上的Haskell社区一般不喜欢给出平坦的答案,这让我很有兴趣,所以我想我会跟随这个趋势(OP也没有要求一个平坦的答案)
以下是一些提示:
foldr
从右到左折
查看tails "abc"
输出tails "abc"
,它是["abc", "bc", "c", ""]
。 你如何构建从右到左的列表? (或换句话说,在列表中添加内容)
从右到左看结果的元素有什么区别? 有模式吗?
我不知道为什么,但我似乎最近到处都看到了展开,包括在这个问题中:
import Data.List (unfoldr)
import Data.Maybe (listToMaybe)
tails :: [a] -> [[a]]
tails = unfoldr (\ xs -> listToMaybe xs >> Just (xs, tail xs))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.