Скажем, у нас есть две функции типа (a -> b -> c)
. Я хочу иметь одну функцию, которая при применении к a
и b
даст d
, объединенную с c
по заданной функции (c -> c -> d)
. Я пришел к этому решению с помощью стрелок:Объединение двух точных функций
combine :: (a -> b -> c) -> (a -> b -> c) -> (c -> c -> d) -> (a -> b -> d)
combine f g op = ((uncurry op) .) . (uncurry (&&&)) . (f &&& g)
Есть ли способ сделать это в более изящном способе, или обобщать его применимым к функциям с большой арностью (например (a -> b -> c -> d) -> (a -> b -> c -> d) -> (d -> d -> e) -> (a -> b -> c -> e)
)?
Я думаю, что было бы лучше с 'op' как infix:' 'f a b' op' g a b''. Я подозреваю, что некоторые люди могут не согласиться; часть этого заключается в том, что мой редактор выделяет инфиксные вещи по-разному, что делает его намного легче читать. –
Это прекрасно, спасибо! Это всегда кажется таким легким, когда вы уже видели ответ :) –