2015-11-28 3 views
2

У меня есть эта функция, которая извлекает четвертый элемент, который бывает целое число, из кортежа:функция 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 

все это можно записать pointfree:

summerRight = (+) . fourth 

Теперь, если я хочу, чтобы выразить сумма как складной склад, мне нужен оператор:

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

Мне не удается написать эту последнюю функцию.

Можно ли написать summerLeft pointfree?

Если это не так, есть ли какая-то возможная аргументация, которая связывает сбрасывание вправо с помощью программирования с нулевой точкой?

ответ

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 
+0

Мммм, это напоминает мне о молочница комбинатора TxY = уг. Похож на общий подход. Спасибо. –

1

Вот еще одно решение:

summerLeft n tuple = n + fourth tuple 
summerLeft n = (n +) . fourth 
summerLeft = (. fourth) . (+) 
Смежные вопросы