2015-04-24 7 views
7

Я пытаюсь реализовать экземпляр Monad. В качестве более простого примера предположим следующее:Должен ли я реализовать Аппликативный и Functor для реализации Monad

Это должна быть стандартная реализация, возможно, насколько мне известно. Однако, это не компилируется, поскольку компилятор жалуется:

Нет экземпляра для (Applicative Maybee)

и точно так же он хочет экземпляр Functor когда Аппликативный дается.

So: Простой вопрос: Должен ли я всегда применять Functor и Applicative, прежде чем я смогу реализовать Monad?

+5

я предвижу много вопросов об этом, после выпуска GHC 7.10. Должны ли мы создать тег предложения * Functor-Applicative-Monad? – Jubobs

ответ

5

С GHC 7.10 и выше, вы должны реализовать Functor и Applicative. Определения классов для Monad мандата суперкласса экземпляры:

class Functor f => Applicative f where ... 
class Applicative m => Monad m where ... 

Обратите внимание, что когда-то у вас есть Monad экземпляр, то Functor и Applicative экземпляры могут быть определены в общем без дополнительных усилий:

import Control.Monad 

-- suppose we defined a Monad instance: 
instance Monad m where ... 

instance Functor m where 
    fmap = liftM 

instance Applicative m where 
    pure = return 
    (<*>) = ap 
+2

На самом деле это не так: в версии 7.8 и старше у 'Monad' не было ограничений по суперклассам. –

+0

Дух, это довольно тяжелая ошибка. –

+0

@ 4castle yes; изм. –

8

Обязательно определять экземпляры для Functor и Applicative (второе - новое требование в новых версиях Haskell), но на самом деле это не так уж и сложно, потому что если вы не хотите вручную писать свои собственные экземпляры, может просто использовать эти из них:

import Control.Applicative (Applicative(..)) 
import Control.Monad  (liftM, ap) 

-- Monad m 

instance Functor m where 
    fmap = liftM 

instance Applicative m where 
    pure = return 
    (<*>) = ap 

 Смежные вопросы

  • Нет связанных вопросов^_^