【发布时间】:2018-09-08 17:51:26
【问题描述】:
“Haskell Programming: From first principle”中的以下代码编译失败:
module Learn where
import Data.Semigroup
import Data.Monoid
-- Exercise: Optional Monoid
data Optional a = Nada
| Only a
deriving (Eq, Show)
instance Monoid a => Monoid (Optional a) where
mempty = Nada
mappend Nada Nada = Nada
mappend (Only a) Nada = Only $ mappend a mempty
mappend Nada (Only a) = Only $ mappend mempty a
mappend (Only a) (Only b) = Only $ mappend a b
它给出了以下错误:
intermission.hs:11:10: error:
• Could not deduce (Semigroup (Optional a))
arising from the superclasses of an instance declaration
from the context: Monoid a
bound by the instance declaration at intermission.hs:11:10-40
• In the instance declaration for ‘Monoid (Optional a)’
|
11 | instance Monoid a => Monoid (Optional a) where
|
为了阻止 ghc 抱怨,我必须创建 Optional a 的半群实例并定义“”。这对我来说不太有意义,我想知道我是否忽略了一些东西。
【问题讨论】:
-
根据幺半群定律,
mappend a mempty可以简化为a。
标签: haskell