Ответ 1
То, что вы хотите сделать, это взять функцию, которая работает с карьерами, h
и применить ее к результату f
, который является кортежем. Этот процесс, превращая функцию двух аргументов в функцию, которая принимает один аргумент, являющийся кортежем, называется неуправляемым. У нас есть Data.Tuple:
curry :: ((a, b) -> c) -> a -> b -> c
-- curry converts an uncurried function to a curried function.
uncurry :: (a -> b -> c) -> (a, b) -> c
-- uncurry converts a curried function to a function on pairs.
Итак, теперь мы можем написать:
f :: a -> (b,c)
f = undefined
h :: b -> c -> d
h = undefined
k :: a -> d
k = uncurry h . f
Еще один сложный способ подумать об этом - через аппликативный функтор,
k = (h <$> fst <*> snd) . f
Идея от Конора Макбрайда, которая написала бы это как: (|f fst snd|) . f
Думаю.