http://palm-mute.livejournal.com/ ([identity profile] palm-mute.livejournal.com) wrote in [personal profile] lomeo 2009-02-03 05:03 pm (UTC)

> 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 - естественно, лучше.

>Спасибо за коммент, кстати, ты всегда заставляешь меня задуматься.
Да ну, не стоит благодарностей. Хорошо, что ты опять пишешь.

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting