S в Хаскелле

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

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

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

Ответы

Ответ 1

s = (<*>) для экземпляра ((->) r) Applicative.

Ответ 2

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

Ответ 3

Его также можно использовать (=<<), (>>=).

И они включены в Prelude

instance Monad ((->) r) where  
    return = const
    f >>= k = \ r -> k (f r) r