向左折叠操作的 Pointfree 函数

Pointfree function for fold left operation

我有这个函数可以从元组中提取第四个元素,它恰好是一个整数:

fourth :: (a, b, c, Int) -> Int
fourth (a, b, c, d) = d

我想对元组列表的所有第四个整数求和。通过将 fourth(+) 组合成合适的 foldr 运算符,我可以在右折叠操作中使用 fourth

summerRight :: (a, b, c, Int) -> Int -> Int
summerRight tuple n = fourth tuple + n

整个事情都可以写成pointfree:

summerRight = (+) . fourth

现在,如果我想将总和表示为左折,我需要一个运算符:

summerLeft :: Int -> (a, b, c, Int) -> Int
summerLeft n tuple = n + fourth tuple

我无法写出最后一个函数 pointfree。

是否可以编写 summerLeft pointfree?

如果不是,是否有一些可能的推理将 fold right 与 pointfree 编程联系起来?

您可以为此使用 flip :: (a -> b -> c) -> b -> a -> c

fourth :: (a, b, c, Int) -> Int
fourth (a, b, c, d) = d

summerLeft :: Int -> (a, b, c, Int) -> Int
summerLeft = flip ((+) . fourth)

main :: IO ()
main = print $ summerLeft 1 (2, 3, 4, 5)

打印

6

这是另一个解决方案:

summerLeft n tuple = n + fourth tuple
summerLeft n = (n +) . fourth
summerLeft = (. fourth) . (+)