向左折叠操作的 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) . (+)
我有这个函数可以从元组中提取第四个元素,它恰好是一个整数:
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) . (+)