2016-03-10 67 views
2

我有類種類不匹配的實例也許

class Functor f => Pointed f where 
    pure :: a -> f a 

的定義,現在我想作實例Maybe。爲什麼這不起作用?

instance Pointed (Maybe s) where 
    pure Nothing = Nothing 
    pure (Just a) = a 


class Functor f where 
    fmap :: (a->b) -> f a -> f b 

錯誤是:

Kind mis-match 
    The first argument of `Pointed' should have kind `* -> *', 
    but `Maybe s' has kind `*' 
    In the instance declaration for `Pointed (Maybe s)' 
Failed, modules loaded: none. 

回答

7

Pointed的定義,f有怎樣* -> *,所以你需要提供用同一種類型構造。 Maybe有這種類型,而(Maybe s)有種類*。如果您在pure定義替代Maybef你:所以

pure :: a -> Maybe a 

你的定義應該是這樣的:

instance Pointed Maybe where 
    pure a = Just a 

那種* -> *推斷爲f由於對kind inference規則。假設a具有種類*,因爲它是功能參數(其種類爲* -> * -> *)。 f a應該有種類*所以f有種類* -> *

Pointed的定義中,Functor f =>是一類上下文,並聲明FunctorPointed的超類。這意味着Pointed的所有實例也必須是Functor的實例。

Maybe已經是Functor的一個實例,所以你不需要自己定義它。

+0

我看不出爲什麼'在指出的定義中,f有種* - > *' 對不起,我忘了給一個Functor的定義。我編輯了帖子。特別是,它究竟意味着什麼?:'類Functor f =>尖f'Functor(f)和Functor f之間的區別是什麼? – Gilgamesz

+0

@Gilgamesz因爲術語'f a'出現在'pure'類型中。 –

+0

好吧,你是對的。但請回答: 究竟是什麼意思?:'class Functor f =>指出f' Functor(f)'和'Functor f'之間的區別? – Gilgamesz

相關問題