Были ли эмулированы наречия, вилки и т. Д. В стиле J через библиотеки на основных функциональных языках?
Была ли когда-либо предпринята попытка эмуляции J-стиля сверхконденсированного неявного программирования с помощью глаголов, наречий, вилок и т. Д. С помощью библиотек для основных функциональных языков?
Если да, насколько успешным был результат?
Если нет, есть ли техническая проблема, которая делает это невозможным, или это просто не стоит делать?
Мне особенно интересны конструкции типа вилок, которые, кажется, не соответствуют напрямую основным понятиям в функциональном программировании.
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/
Он извлек код из своих постов в библиотеку, доступную на сайте hackage: http://hackage.haskell.org/package/ZipFold
Разве молчаливое программирование не очень близко соответствует логике комбинатора или бессмысленному бессмысленному стилю в Haskell? Например, в то время как я не знаю J, из чего я собираю "форк" переводит три функции f
, g
, а также h
и аргумент x
в выражение g (f x) (h x)
, Операция "применить несколько функций к одному аргументу, а затем применить результаты друг к другу в последовательности" является обобщением S комбинатора Карри Шенфинкеля и в Хаскелле соответствует 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 для разделения аргументов.