Разве молчаливое программирование не очень близко соответствует логике комбинатора или бессмысленному бессмысленному стилю в Haskell? Например, хотя я не знаю J, из того, что я собираю, «вилка» переводит три функции f
, g
и h
и аргумент x
в выражение g (f x) (h x)
. Операция «применить несколько функций к одному аргументу, а затем применить результаты друг к другу в последовательности» является обобщением комбинатор Шенфинкеля * Шерфинкеля и в Haskell соответствует Applicative
Экземпляр монады Reader.
Комбинатор fork
в Haskell, так что fork f g h x
соответствует результату, указанному выше, будет иметь тип (t -> a) -> (a -> b -> c) -> (t -> b) -> t -> c
. Интерпретируя это как использование функтора Reader ((->) t)
и переписывая его для произвольного функтора, тип становится f a -> (a -> b -> c) -> f b -> f c
. Замена первых двух аргументов дает нам (a -> b -> c) -> f a -> f b -> f c
, который является типом liftA2
/ liftM2
.
Таким образом, для общего примера вычисления среднего, вилка +/ % #
может быть переведена непосредственно как flip liftA2 sum (/) (fromIntegral . length)
или, если кто-то предпочитает инфиксные Applicative
комбинаторы, как (/) <$> sum <*> fromIntegral . length
.
Если нет, то есть техническая проблема, которая делает это невозможным, или это просто не стоит делать?
По крайней мере, в Haskell, я думаю, что главная проблема заключается в том, что стиль без точек считается запутанным и нечитаемым, особенно при использовании монады Reader для разделения аргументов.