我最近在学习Haskell,遇到了一些我不太理解的东西:lambda函数的参数。
在Learn You a Haskell for Great Good一书中,第 1 章。5、有以下两个功能:
elem' :: (Eq a) => a -> [a] -> Bool
elem' y ys = foldr (\x acc -> if x == y then True else acc) False ys
Run Code Online (Sandbox Code Playgroud)
reverse' :: [a] -> [a]
reverse' = foldl (\acc x -> x : acc) []
Run Code Online (Sandbox Code Playgroud)
在第一个函数中,累加器被列为 lambda 的第二个参数,但 then 是第一个跟随 lambda for 的参数foldl,我认为这意味着它将是第一个,而不是第二个,因此,违背了预期。
而在第二个函数中,它遵循预期,显示为 lambda 的第一个参数,从而使reverse'作为参数的列表成为 lambda 的第二个参数。
我测试了这两个功能,它们按预期工作。我还注意到一个函数涉及右折叠,另一个函数涉及左折叠,但我不确定为什么这会改变参数的含义。
问题:有人可以解释一下我缺少什么吗?为什么参数似乎交换了位置?
我正在解决 99 个 Haskell 问题并尝试使用这段代码来解决第二个问题,这需要返回数组的倒数第二个元素:
myPen :: [a] -> a
myPen [] = error "Empty lists have no penultimate element."
myPen list@(_:xs)
| length list == 1 = error "Lists size 1 have no penultimate element."
| length xs == 2 = head xs
| otherwise = myPen xs
Run Code Online (Sandbox Code Playgroud)
这段代码可以编译,但是当给出输入时
myPen [1,2]
Run Code Online (Sandbox Code Playgroud)
它产生错误
*** Exception: Lists size 1 have no penultimate element.
CallStack (from HasCallStack):
error, called at prob1_10.hs:16:25 in main:Main
Run Code Online (Sandbox Code Playgroud)
据我所知,@在这种情况下应该允许引用整个列表,但它似乎只引用xs了列表的或尾部。
这似乎支持了它应该同时包含x和的论点 …
haskell ×2