lomeo: (лямбда)
Пару лет назад на RSDN я показывал VladD2 связь query monad из HaskellDB с LINQ. Тогда он называл это бредом. Прошёл год или около того и он сам стал связывать HaskellDB и LINQ. Правда, к монадам отношение у него не изменилось - это способ связывания вычислений в цепочку (почти дословно).

А сегодня IB под впечатлением от того, что LINQ - это монады.

Откуда эта истерика по отношению к монадам? Почему не возникает такого нездорового ажиотажа вокруг моноидов? Они же гораздо абстрактнее, чище и прикольнее :-)

Причём я почти уверен (насчёт VladD2 больше, насчёт IB меньше), что у обоих представление о монадах мало связано с тем, что это математическая модель. Для них это скорее некий паттерн. Место монады в математике не видно - так, приёмчик. Неудивительно, что VladD2 называет это извращением.

Что ли написать свой туториал по монадам? :-)

fixIO

Apr. 6th, 2009 07:13 pm
lomeo: (лямбда)
Предыстория: http://thesz.livejournal.com/950788.html?thread=7471620#t7471620

Т.е. предполагалось, что любой mdo можно развернуть в letrec (т.е. do без mfix).
Read more... )
lomeo: (лямбда)
Понадобилось мне состояние, вычисление которого можно прервать в любой момент. Комбинатор guard не подходит тем, что его просто нет для State. if/then/else не устравает, потому что иногда прерывать необходимо в любом месте, например, в одной из вызываемой функции рекурсивной функции:
loop = do
    modify (+1)
    check
    loop

check = do
    s <- get
    if s == 42
        then interrupt
        else return ()

Вот как тут описать комбинатор interrupt?
Read more... )
lomeo: (лямбда)
Когда мы пишем монадическую функцию с хвостовой рекурсией, то явно эта функция не хвостато-рекурсивная:

loop = do
    cmd <- getLine
    if (cmd == ":q")
        then return ()
        else loop


чуть-чуть кода и много вопросов )

StateUndo

Jan. 16th, 2007 04:42 pm
lomeo: (лямбда)
Состояние, позволяющее откатывать изменения, легко реализуется поверх уже имеющегося типа данных Control.Monad.State.State.
Немножко кода )
lomeo: (лямбда)
Хорошая статья про монад-трансформеры для тех, кто ещё не понимает как с ними работать:
Monad transformers step-by-step
lomeo: (лямбда)
Только сейчас сообразил, что это одно и то же для ВСЕХ монад.
До сих пор думал, что они совпадают у IO и списка.

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

class Functor m => Monad m where
    return :: m a
    (>>=) :: m a -> (a -> m b) -> m b

    instance Functor m where
        fmap f m = m >>= (return . f)


Ну и хорошо, что нельзя. А то от Functor много классов могут зависеть.
lomeo: (лямбда)
Рассматривая тип data S a = S a (S a) я увидел, что его нельзя сделать монадой - не будет работать либо первый, либо второй закон монад. Кто знает, есть ли какие то правила, позволяющие вычислить (или хотя бы почувствовать), что такой то тип не может быть монадой?

Profile

lomeo: (Default)
Dmitry Antonyuk

December 2015

S M T W T F S
  12345
6789101112
131415 16171819
20212223242526
2728293031  

Syndicate

RSS Atom

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 22nd, 2017 04:45 pm
Powered by Dreamwidth Studios