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