小编Cha*_*ony的帖子

对 Haskell lambda 中的参数感到困惑

我最近在学习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 的第二个参数。

我测试了这两个功能,它们按预期工作。我还注意到一个函数涉及右折叠,另一个函数涉及左折叠,但我不确定为什么这会改变参数的含义。

问题:有人可以解释一下我缺少什么吗?为什么参数似乎交换了位置?

haskell

5
推荐指数
1
解决办法
452
查看次数

为什么 Haskell 中的这个“@”用法不能包含整个列表?

我正在解决 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

1
推荐指数
1
解决办法
75
查看次数

标签 统计

haskell ×2