LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

Хаскелисты же придумали монады, а теперь многие годы только и пытаются от них избавиться. Как и от ленивого вычисления, которое уже несколько лет как можно отключать одним флагом по всему модулю.

???

Если не использовать монады и ленивое вычисление, проще не использовать Haskell.

А потому что IO STM STRef a, и давай попробуй пробросить возможность вызывать putStr в какой-то вложенной функции без сишных хаков.

А зачем? В SQL внутри SELECT тоже нельзя сделать вывод строки при чтении строки из таблицы. Ты им тоже стараешься не пользоваться?

На чистые функции гораздо легче пишутся тесты.

прямо-таки заставляют тщательно продумывать и просчитывать архитектуру функций — что, зачастую, непозволительная и бессмысленная роскошь.

Пиши всё в IO и не парься. Тогда ничего просчитывать не надо.

все языки с буйным метапрограммированием провалились.

Common Lisp жив, Tcl тоже. C++, Ruby и Rust вообще очень сильно распространены.

В Racket не любят макросы ровно по одной причине: макрос нельзя сохранить как значение. В Racket я могу написать (map call-with-input-file files processors), а в Common Lisp (или Clojure) придётся писать что-то вроде (mapc (lambda (f p) (with-input-file f (funcall p))) files processors).

Ты утверждаешь, что для чтения макросов приходится использовать инструменты отладчика.

Не приходится, а возможно. Также как в Си иногда проще пропустить через cpp, чем искать во что раскрывается define. Но часто ли так делаешь?

К слову, для незнакомой функции быстро получить её раскрытый исходник (с инлайном всех не библиотечных функций) гораздо сложнее. Или для шаблона C++ получить во что он раскрывается.

но в самом коде в реальности черт ногу сломит, потому нужны посредники для его чтения, потому читаемости низкая.

Что проще читается:

(loop for i from 5 to 15 collecting i)

или

(let ((acc nil))
  (dotimes (i1 11 (nreverse acc))
    (push (+ i1 5) acc)))

?

Исправление monk, :

Хаскелисты же придумали монады, а теперь многие годы только и пытаются от них избавиться. Как и от ленивого вычисления, которое уже несколько лет как можно отключать одним флагом по всему модулю.

???

Если не использовать монады и ленивое вычисление, проще не использовать Haskell.

А потому что IO STM STRef a, и давай попробуй пробросить возможность вызывать putStr в какой-то вложенной функции без сишных хаков.

А зачем? В SQL внутри SELECT тоже нельзя сделать вывод строки при чтении строки из таблицы. Ты им тоже стараешься не пользоваться?

На чистые функции гораздо легче пишутся тесты.

прямо-таки заставляют тщательно продумывать и просчитывать архитектуру функций — что, зачастую, непозволительная и бессмысленная роскошь.

Пиши всё в IO и не парься. Тогда ничего просчитывать не надо.

все языки с буйным метапрограммированием провалились.

Common Lisp жив, Tcl тоже. C++, Ruby и Rust вообще очень сильно распространены.

В Racket не любят макросы ровно по одной причине: макрос нельзя сохранить как значение. В Racket я могу написать (map call-with-input-file files processors), а в Common Lisp (или Clojure) придётся писать что-то вроде (mapc (lambda (f p) (with-input-file f (funcall p))) files processors).

Ты утверждаешь, что для чтения макросов приходится использовать инструменты отладчика.

Не приходится, а возможно. Также как в Си иногда проще пропустить через cpp, чем искать во что раскрывается define. Но часто ли так делаешь?

К слову, для незнакомой функции быстро получить её раскрытый исходник (с инлайном всех не библиотечных функций) гораздо сложнее. Или для шаблона C++ получить во что он раскрывается.

но в самом коде в реальности черт ногу сломит, потому нужны посредники для его чтения, потому читаемости низкая.

Что проще читается:

(loop for i from 5 to 15 collecting i)

или

(let ((acc nil))
  (dotimes (i1 10 (nreverse acc))
    (push (+i1 5) acc)))

?

Исходная версия monk, :

Хаскелисты же придумали монады, а теперь многие годы только и пытаются от них избавиться. Как и от ленивого вычисления, которое уже несколько лет как можно отключать одним флагом по всему модулю.

???

Если не использовать монады и ленивое вычисление, проще не использовать Haskell.

А потому что IO STM STRef a, и давай попробуй пробросить возможность вызывать putStr в какой-то вложенной функции без сишных хаков.

А зачем? В SQL внутри SELECT тоже нельзя сделать вывод строки при чтении строки из таблицы. Ты им тоже стараешься не пользоваться?

На чистые функции гораздо легче пишутся тесты.

прямо-таки заставляют тщательно продумывать и просчитывать архитектуру функций — что, зачастую, непозволительная и бессмысленная роскошь.

Пиши всё в IO и не парься. Тогда ничего просчитывать не надо.

все языки с буйным метапрограммированием провалились.

Common Lisp жив, Tcl тоже. C++, Ruby и Rust вообще очень сильно распространены.

В Racket не любят макросы ровно по одной причине: макрос нельзя сохранить как значение. В Racket я могу написать (map call-with-input-file files processors), а в Common Lisp (или Clojure) придётся писать что-то вроде (mapc (lambda (f p) (with-input-file f (funcall p))) files processors).

Ты утверждаешь, что для чтения макросов приходится использовать инструменты отладчика.

Не приходится, а возможно. Также как в Си иногда проще пропустить через cpp, чем искать во что раскрывается define. Но часто ли так делаешь?

К слову, для незнакомой функции быстрого метода получить её раскрытый исходник (с инлайном всех не библиотечных функций) гораздо сложнее. Или для шаблона C++ получить во что он раскрывается.

но в самом коде в реальности черт ногу сломит, потому нужны посредники для его чтения, потому читаемости низкая.

Что проще читается:

(loop for i from 5 to 15 collecting i)

или

(let ((acc nil))
  (dotimes (i1 10 (nreverse acc))
    (push (+i1 5) acc)))

?