我有这个函数从元组中提取第四个元素,恰好是一个整数:
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?
如果不是,是否有一些可能的推理将折叠与无点编程相关联?
答案 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) . (+)