Запись в пустом стиле f x = g x x
Я изучаю Хаскелл. Мне жаль, что я задал очень простой вопрос, но я не могу найти ответ. У меня есть функция f, определяемая следующим образом:
f x = g x x
где g - уже определенная функция из 2 аргументов. Как написать этот стиль без стресса?
Изменить: без использования выражения лямбда.
Спасибо
Ответы
Ответ 1
f
можно записать с помощью Control.Monad.join
:
f = join g
join
в функции monad является одним из примитивов, используемых при построении бессточных выражений , так как он не может быть определен в самом точечном стиле (его эквивалент SKI, SII
- ap id id
в Haskell - не печатает).
Ответ 2
Это называется комбинатор "W" :
import Control.Monad
import Control.Monad.Instances
import Control.Applicative
f = join g -- = Wg (also, join = (id =<<))
= (g `ap` id) -- \x -> g x (id x) = SgI
= (<*> id) g -- = CSIg
= g =<< id -- \x -> g (id x) x
= id =<< g -- \x -> id (g x) x
S, K, I - это один базовый набор комбинаторов; B, C, K, W - еще один - вам нужно остановиться где-нибудь (re: ваше выражение "no lambda expression" ):
_B = (.) -- _B f g x = f (g x) = S(KS)K
_C = flip -- _C f x y = f y x = S(S(K(S(KS)K))S)(KK)
_K = const -- _K x y = x
_W = join -- _W f x = f x x = CSI = SS(KI) = SS(SK)
_S = ap -- _S f g x = f x (g x) = B(B(BW)C)(BB) = B(BW)(BBC)
= (<*>) -- from Control.Applicative
_I = id -- _I x = x = WK = SKK = SKS = SK(...)
{-
Wgx = gxx
= SgIx = CSIgx
= Sg(KIg)x = SS(KI)gx
= gx(Kx(gx)) = gx(SKgx) = Sg(SKg)x = SS(SK)gx
-- _W (,) 5 = (5,5)
-- _S _I _I x = x x = _omega x -- self-application, untypeable
-}