Были ли эмулированы наречия, вилки и т. Д. В стиле J через библиотеки на основных функциональных языках? - PullRequest
23 голосов
/ 03 августа 2010

Была ли когда-либо предпринята попытка эмуляции J-стиля сверхконденсированного молчаливого программирования с помощью глаголов, наречий, вилок и т. Д. Через библиотеки для основных функциональных языков?

Если да, насколько успешным был результат?

Если нет, то есть техническая проблема, которая делает это невозможным, или это просто не стоит делать?

Меня особенно интересуют конструкции типа вилок, которые, по-видимому, не соответствуют основным понятиям в функциональном программировании.

Ответы [ 2 ]

12 голосов
/ 03 августа 2010

Разве молчаливое программирование не очень близко соответствует логике комбинатора или бессмысленному бессмысленному стилю в 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 для разделения аргументов.

8 голосов
/ 03 августа 2010

Дискуссия Кэмканна довольно хороша. Но обратите внимание, что этот стиль теперь приводит к двум обходам.

Вы можете написать библиотеку комбинаторов, которая объединяет обходы. Посмотреть здесь: 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

...