![](/img/trans.png)
[英]Semigroup/Monoid/Group type class hierarchy in Haskell errors
[英]Instance declaration for datatype MyList to Class Semigroup and Class Monoid
MyList就像列表一样,我已经定义了一些函数来创建concat'
(相当于(++)
。 我想为MyList a
做一个实例声明
instance Semigroup [a] where
-- (<>) :: [a] -> [a] -> [a]
(<>) = (++)
instance Monoid [a] where
-- mempty :: [a]
mempty = []
我有GHCi版本8.2.2。
data MyList a = Leer | Element a (MyList a) deriving (Show,Eq)
last' :: Eq a => MyList a -> a
last' Leer = undefined
last' (Element x(xs))
| xs == Leer = x
| otherwise = last' xs
w :: MyList a -> a -> MyList a
w Leer x = Element x (Leer)
w xs x = Element x (xs)
concat' :: Eq a => MyList a -> MyList a -> MyList a
concat' x Leer = x
concat' (Element x (xs)) ys
| xs == Leer = (Element x (ys))
| otherwise = concat' (Element x (deletelst xs)) (w ys (last' xs))
length' :: MyList a -> Int
length' Leer = 0
length' (Element x (xs)) = 1 + length' (xs)
take' :: Int -> MyList a -> MyList a
take' _ Leer = Leer
take' 0 _ = Leer
take' z (Element x (xs)) = Element x (take' (z-1) xs)
deletelst :: MyList a-> MyList a
deletelst Leer = Leer
deletelst xs = (take' ((length' xs) - 1) xs)
instance Semigroup (MyList a) where
(<>) = concat'
instance Monoid (MyList a) where
mempty = Leer
mappend = (<>)
当我尝试编译程序时,会弹出此错误消息:
FH.hs:115:12: error:
* No instance for (Eq a) arising from a use of concat'
Possible fix: add (Eq a) to the context of the instance declaration
* In the expression: concat'
In an equation for `<>': (<>) = concat'
In the instance declaration for `Semigroup (MyList a)'
错误消息告诉您问题出在哪里 :
* In the expression: concat'
In an equation for `<>': (<>) = concat'
In the instance declaration for `Semigroup (MyList a)'
在这里:
instance Semigroup (MyList a) where
(<>) = concat'
它还告诉您问题是什么 :
* No instance for (Eq a) arising from a use of concat'
Possible fix: add (Eq a) to the context of the instance declaration
确实,您正在使用concat'
来定义(<>)
,但是您对concat'
的定义需要一个Eq a
实例,该实例不作为Semigroup (MyList a)
实例声明的上下文Semigroup (MyList a)
-换句话说,您定义instance Semigroup (MyList a)
而不是instance Eq a => Semigroup (MyList a)
。 您可以添加该上下文,但是有一个更原则的解决方案:通过使用模式匹配,从concat'
(以及last'
)的定义中删除(不必要的) Eq a
约束:
concat' :: MyList a -> MyList a -> MyList a
concat' x Leer = x
concat' (Element x Leer) ys = Element x ys
concat' (Element x xs) ys = concat' (Element x (deletelst xs)) (w ys (last' xs))
last' :: MyList a -> a
last' Leer = undefined
last' (Element x Leer) = x
last' (Element x xs) = last' xs
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.