这是我的take版本使用foldr:
myTake n list = foldr step [] list
where step x y | (length y) < n = x : y
| otherwise = y
main = do print $ myTake 2 [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)
输出不是我所期望的:
[3,4]
Run Code Online (Sandbox Code Playgroud)
然后我尝试通过插入y自身的长度进行调试,结果是:
[3,2,1,0]
Run Code Online (Sandbox Code Playgroud)
我不明白为什么长度按降序插入.也许我错过了一些明显的事
我是Haskell的新手,我正在阅读"Real World Haskell"这本书 .在本书的第4章中,作者要求使用fold重写groupBy函数.本书的一位读者(Octavian Voicu)给出了以下解决方案:
theCoolGroupBy :: (a -> a -> Bool) -> [a] -> [[a]]
theCoolGroupBy eq xs = tail $ foldr step (\_ -> [[]]) xs $ (\_ -> False)
where step x acc = \p -> if p x then rest p else []:rest (eq x)
where rest q = let y:ys = acc q in (x:y):ys
Run Code Online (Sandbox Code Playgroud)
我的问题很简单:我知道foldr有3个参数:一个函数,一个初始值和一个列表.但在代码的第二行,foldr需要4个参数.为什么会这样? 谢谢.