折叠左操作的无点功能

时间:2015-11-28 08:22:19

标签: haskell fold pointfree

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

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

我想要对元组列表中的所有第四个整数求和。我可以通过将fourth(+)合并到合适的foldr运算符中,在右侧折叠操作中使用summerRight :: (a, b, c, Int) -> Int -> Int summerRight tuple n = fourth tuple + n

summerRight = (+) . fourth

整个事情可以写成无点:

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

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

summerLeft

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

是否可以写{{1}} pointfree?

如果不是,是否有一些可能的推理将折叠与无点编程相关联?

2 个答案:

答案 0 :(得分:3)

您可以使用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

答案 1 :(得分:1)

这是另一种解决方案:

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