S>instance Monad Maybe2 where
S> return x = Just2 x
S> Nothing2 >>= f = Nothing2
S> Just2 x >>= f = f x
S> fail _ = Nothing2
S>
S>В общем, как сделать полный аналог Maybe?
Операция >>= должна возвращать монаду, у тебя нет:
Just2 x >>= f = f x
Ты вернул некоторое значение f(x), а нужно было вернуть монаду, в которую завернуто f(x)
Правильно будет так:
Just2 x >>= f = Just2 (f x)
Касательно fmap. Для того, чтобы работало fmap тебе нужно твою монаду сделать функтором (instance Functor Maybe2). Т.е. "реализовать интерфейс" Functor, в котором описана эта функция fmap. До этого времени fmap для Just2 не определена.
Здравствуйте, Shmj, Вы писали:
S>Так что не вводите в заблуждение.
Да, затупил, с утра пораньше. В реализации операции >>= нет ошибки.
Но, как уже сказали, для Monad нужен Applicative, а для него, в свою очередь, нужен Functor
S>Пока рабочего примера нет
Итого, полный код таков:
data Maybe2 a = Just2 a | Nothing2
instance Functor Maybe2 where
fmap _ Nothing2 = Nothing2
fmap f (Just2 a) = Just2 (f a)
instance Applicative Maybe2 where
pure = Just2
Just2 f <*> m = fmap f m
Nothing2 <*> _m = Nothing2
Just2 _m1 *> m2 = m2
Nothing2 *> _m2 = Nothing2
instance Monad Maybe2 where
return x = Just2 x
Nothing2 >>= f = Nothing2
Just2 x >>= f = f x
fail _ = Nothing2
Здравствуйте, Буравчик, Вы писали:
Б>Твой функтор не умеет работать со списками. Не хватает:
Б>
Б>instance Functor2 [] where
Б> fmap2 = map
Б>
Ясно, более-менее начинает прояснятся. Т.е. можно рассматривать как просто один из шаблонов проектирования + красивый синтаксис благодаря поддержке этих фишек на уровне языка.