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