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

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

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

В противном случае существует ли технический вопрос, который делает это невозможным, или разве это просто не стоит сделать?

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

24
задан Rodrigo de Azevedo 9 July 2018 в 18:20
поделиться

2 ответа

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

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

8
ответ дан 29 November 2019 в 00:21
поделиться

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

12
ответ дан 29 November 2019 в 00:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: