Подтвердить что ты не робот

Были ли наречия J, вилки и т.д. Имитированы через библиотеки в основных функциональных языках?

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

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

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

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

4b9b3361

Ответ 1

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

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

Кроме того, последующие сообщения Conal Eliott обобщают это гораздо дальше: http://conal.net/blog/posts/enhancing-a-zip/

Он вытащил код из своих сообщений в библиотеку, доступную в хаке: http://hackage.haskell.org/package/ZipFold

Ответ 2

Не молчаливое программирование довольно близко соответствует логике комбинатора или бессмысленному бесконтактному стилю в Haskell? Например, хотя я не знаю J из того, что я собираю, "fork" переводит три функции f, g и h и аргумент x в выражение g (f x) (h x). Операция "применять несколько функций к одному аргументу, а затем последовательно применять результаты друг к другу" - это обобщение комбината Curry's Schönfinkel S, а в Haskell соответствует Applicative экземпляр монады читателя.

A 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.

Итак, для общего примера вычисления среднего, fork +/ % # может быть переведен непосредственно как flip liftA2 sum (/) (fromIntegral . length) или, если вы предпочитаете комбинаторы infix Applicative, как (/) <$> sum <*> fromIntegral . length.

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

В Haskell, по крайней мере, я думаю, что основная проблема заключается в том, что стиль с наименьшей точкой считается запутанным и нечитаемым, особенно при использовании монады Reader для разделения аргументов.