S комбинатор в Хаскеле

Можно ли выразить аналог комбинатораS в Haskell, используя только стандартные функции (не определяя его уравнением) и не используя лямбду (анонимная функция)? Я ожидаю, что по типу (a -> b -> c) -> (a -> b) -> a -> c,

Например, аналог комбинатора K просто const,

На самом деле я пытаюсь выразить функцию \f x -> f x x используя стандартные функции, но не может придумать ни одной стандартной нелинейной функции для начала (это функция, которая использует свой аргумент более одного раза).

3 ответа

Решение

s = (<*>) для ((->) r)Applicative пример.

Хотя на первый взгляд это не так, ap это комбинатор S (и join это комбинатор, который вы действительно после).

Может также использоваться (=<<), (>>=),

И они включены в прелюдии

instance Monad ((->) r) where  
    return = const
    f >>= k = \ r -> k (f r) r  
Другие вопросы по тегам