2017-06-29 77 views
0

從含半幺羣mempty函數的類型的簽名是: - :該類型的實例是什麼?

mempty :: Monoid b => a -> b 

由於

*Exercises Data.Monoid> :t mempty 
mempty :: Monoid a => a 

當我看類型簽名功能(>)類型類含半幺羣爲mempty功能變得上鍵入a將通過a -> b進行更換。

mempty :: Monoid a => a 
mempty :: a -> b 

我沒有提到b必須是一個Monoid,否則mappend功能是行不通的。

現在我有以下數據類型

newtype Combine a b = 
    Combine { unCombine :: a -> b } 

instance (Semigroup b) 
    => Semigroup (Combine a b) where 
    Combine {unCombine=f} <> Combine {unCombine=g} = Combine (f <> g) 

instance (Semigroup b, Monoid b) 
    => Monoid (Combine a b) where 
    mempty = Combine mempty 
    mappend = (<>) 

mempty函數簽名怎麼看起來像Combine

所以我會做的正是與上述相同的方式:以

mempty :: Monoid a => a 

a將取代通過合併,然後就變成:

的mempty聲明

mempty :: Combine a b 

+0

你忘了約束'Monoid b'。 'mempty :: Monoid b =>合併一個b'。 '合併一個b'只是'a - > b'的一個包裝。所以它基本上是'Monoid b => a - > b'。 '=>'之前的部分是typeclass,它在編譯時被相應的類型字典替換。它告訴編譯器如何產生一個'b'類型的值。 – ftor

回答

3

爲什麼不問ghci?你有mempty = Combine mempty,所以:

> :t Combine mempty 
Combine mempty :: Monoid b => Combine a b 

。因此memptyCombine類型必須至少與特定的作爲。

相關問題