Тип переменной m
- это не то, на что вы можете сопоставить рисунок, особенно для того, чтобы отличать Just
и Nothing
. Подумайте, что это означало бы для разных возможных типов, используемых вместо m
- во многих случаях такое совпадение шаблонов было бы совершенно невозможно.
Чтобы написать этот экземпляр, вам нужно что-то вроде этого:
instance (Monad m) => Monad (M m) where
return x = Mk (return (Just x))
Mk mx >>= f = -- ??
return
Обратите внимание на используемый для создания значения типа m (Maybe a)
--that возможно из-за Monad m
ограничения, и в общем случае (без каких-либо ограничений) не было бы способа создать такое значение.
Для реализации (>>=)
вам нужно сделать что-то подобное, также используя (>>=)
для Monad
экземпляра m
.
Кстати, вам стоит подумать о том, чтобы использовать newtype
для M
, если у вас нет определенной причины для получения data
. В большинстве случаев, если вы можете использовать newtype
, вам нужно.
Thnaks вы оба! Теперь я понял, что я делаю неправильно! – nicoan