> ifM (return True) thenM (print "yes") elseM (print "no") Прикольный фокус, я не додумался. thenM, естественно, будет типа ThenM, и у ifM будет тип ifM :: m Boold -> ThenM -> ...?
>А то получается, что мы сравниваем вызов, использующий комбинатор, и явный инлайн этого комбинатора Если мы говорим только о понятности кода, это вполне допустимое сравнение. Вернемся к катаморфизмам, вот пример из статьи Джонса:
len = cata (\fa -> case fa of
Nil -> zero
Cons z zs -> succ zs)
Та же самая функция без катаморфизмов выглядела бы так:
len xs = case xs of
Nil -> zero
Cons z zs -> succ (len zs)
Ее можно получить из первой совершенно автоматически. foldr из стандартной библиотеки можно использовать без сопоставления с образцом только потому, что foldr не совсем катаморфизм, т.к. принимает 2 аргумента вместо одного - тут можно вспомнить о том, что любой АТД с N конструкторами можно представить в виде функции с N аргументами, и вместо встроенного в язык паттерн-матчинга использовать вызов функции. Похожий случай и стандартной библиотеки - функция either, которая ничего, кроме паттерн-матчинга, собственно, не делает. Ее вызов с двумя лямбдами ничем не лучше case-выражения, ее удобно использовать только в point-free стиле. Потому мне кажется, что, повторюсь, с точки зрения понятности кода, foldr не намного лучше рекурсии. Более специализированные комбинаторы типа map - естественно, лучше.
>Спасибо за коммент, кстати, ты всегда заставляешь меня задуматься. Да ну, не стоит благодарностей. Хорошо, что ты опять пишешь.
no subject
Прикольный фокус, я не додумался. thenM, естественно, будет типа ThenM, и у ifM будет тип ifM :: m Boold -> ThenM -> ...?
>А то получается, что мы сравниваем вызов, использующий комбинатор, и явный инлайн этого комбинатора
Если мы говорим только о понятности кода, это вполне допустимое сравнение. Вернемся к катаморфизмам, вот пример из статьи Джонса:
Та же самая функция без катаморфизмов выглядела бы так:
Ее можно получить из первой совершенно автоматически.
foldr из стандартной библиотеки можно использовать без сопоставления с образцом только потому, что foldr не совсем катаморфизм, т.к. принимает 2 аргумента вместо одного - тут можно вспомнить о том, что любой АТД с N конструкторами можно представить в виде функции с N аргументами, и вместо встроенного в язык паттерн-матчинга использовать вызов функции. Похожий случай и стандартной библиотеки - функция either, которая ничего, кроме паттерн-матчинга, собственно, не делает. Ее вызов с двумя лямбдами ничем не лучше case-выражения, ее удобно использовать только в point-free стиле.
Потому мне кажется, что, повторюсь, с точки зрения понятности кода, foldr не намного лучше рекурсии. Более специализированные комбинаторы типа map - естественно, лучше.
>Спасибо за коммент, кстати, ты всегда заставляешь меня задуматься.
Да ну, не стоит благодарностей. Хорошо, что ты опять пишешь.