Эмуляция стиля J супер сжатого молчаливого программирования через глаголы, наречия, имеют ветвления, и т.д., когда-нибудь предпринятый через библиотеки для основных функциональных языков?
Если так, насколько успешный был результат?
В противном случае существует ли технический вопрос, который делает это невозможным, или разве это просто не стоит сделать?
Я особенно интересуюсь конструкциями как ветвления, которые, кажется, не соответствуют непосредственно фундаментальным понятиям в функциональном программировании.
Обсуждение Камканна довольно хорошее. Но обратите внимание, что этот стиль теперь приводит к двум обходам.
Вы можете написать библиотеку комбинатора, объединяющую обходы. Глянь сюда: http://squing.blogspot.com/2008/11/beautiful-folding.html
В сообщении предлагается следующий пример написания среднего:
meanF :: Fractional a => Fold a a
meanF = bothWith (/) sumF (after lengthF fromIntegral)
mean :: Fractional a => [a] -> a
mean = cfoldl' meanF
Кроме того, последующие сообщения Конала Элиотта обобщают это гораздо дальше: http://conal.net/blog/posts/enhancing-a-zip/
Он вытащил код из своих сообщений в библиотеку, доступную для взлома: http://hackage.haskell.org/package/ZipFold
Разве неявное программирование очень близко соответствует комбинаторной логике или бессмысленному бесточечному стилю в Haskell? Например, хотя я не знаю J из того, что я понял, «вилка» переводит три функции f
, g
и h
и аргумент ] x
в выражение g (fx) (hx)
. Операция «применить несколько функций к одному аргументу, а затем последовательно применить результаты друг к другу» является обобщением комбинатора S Карри Шёнфинкеля, а в Haskell соответствует ] Аппликативный
экземпляр монады Reader.
Комбинатор fork
в Haskell, такой что fork fghx
соответствует указанному выше результату, будет иметь тип (t -> a) -> (a -> b - > c) -> (t -> b) -> t -> c
. Интерпретируя это как использование функтора Reader ((->) t)
и переписывая его для произвольного функтора, тип становится fa -> (a -> b -> c) -> fb - > FC
. Замена первых двух аргументов дает нам (a -> b -> c) -> fa -> fb -> fc
, который является типом liftA2
/ liftM2
.
Итак, для общего примера вычисления среднего, вилка + /% #
может быть напрямую преобразована как flip liftA2 sum (/) (fromIntegral. Length)
или, если один предпочитает инфиксные Аппликативные
комбинаторы, такие как (/) <$> sum <*> fromIntegral. длина
.
Если нет, то есть техническая проблема, которая делает это невозможным, или это просто не стоит делать?
По крайней мере, в Haskell, я думаю, что основная проблема заключается в том, что чрезвычайно свободный от точек стиль считается запутанным и нечитаемым, особенно при использовании монады Reader для разделения аргументов.