S комбинатор в Хаскеле
Можно ли выразить аналог комбинатораS в Haskell, используя только стандартные функции (не определяя его уравнением) и не используя лямбду (анонимная функция)? Я ожидаю, что по типу (a -> b -> c) -> (a -> b) -> a -> c
,
Например, аналог комбинатора K просто const
,
На самом деле я пытаюсь выразить функцию \f x -> f x x
используя стандартные функции, но не может придумать ни одной стандартной нелинейной функции для начала (это функция, которая использует свой аргумент более одного раза).
3 ответа
Решение
Хотя на первый взгляд это не так, ap
это комбинатор S (и join
это комбинатор, который вы действительно после).
Может также использоваться (=<<), (>>=)
,
И они включены в прелюдии
instance Monad ((->) r) where
return = const
f >>= k = \ r -> k (f r) r