"Haskell Programming: from first principles“中的以下代码无法编译:
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的抱怨,我不得不创建一个可选a的半群实例,并定义"<>“。这对我来说不太合理,我想知道我是不是忽略了什么。
发布于 2018-09-09 02:04:40
"NOTE: Semigroup is a superclass of Monoid since base-4.11.0.0.“
中的超类列表一直在缓慢演变。随着新的有用类的提出,旧类的API会更新以反映它们之间的关系。这会带来破坏旧代码的不幸后果。Base 4.11.1.0于2018年4月发布,对Monoid进行了这一突破性的更改。
发布于 2018-12-16 17:33:15
以下是解决方案:
import Data.Monoid
data Optional a = Nada | Only a deriving (Eq, Show)
instance Monoid a => Monoid (Optional a) where
mempty = Nada
instance Semigroup a => Semigroup (Optional a) where
Nada <> (Only a) = Only a
(Only a) <> Nada = Only a
(Only a) <> (Only a') = Only (a <> a')
Nada <> Nada = Nada
main :: IO ()
main = do
print $ Only (Sum 1) `mappend` Only (Sum 1)https://stackoverflow.com/questions/52237895
复制相似问题