Подтвердить что ты не робот

Состав функции в Haskell с аргументами кортежа

Иногда у меня есть две функции вида:

f :: a -> (b1,b2)
h :: b1 -> b2 -> c

и мне нужна композиция g. Я решаю это, меняя h на h ':

h' :: (b1,b2) -> c

Не могли бы вы показать мне (если возможно) функцию m, чтобы:

(h . m . f) == (h' . f)

Или другой способ справиться с такими ситуациями. Спасибо.

4b9b3361

Ответ 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 Думаю.

Ответ 2

Что вы хотите сделать, это uncurry h. Эта функция принимает a -> b -> c и преобразует ее в (a, b) -> c.

uncurry h . f