簡體   English   中英

數據類型MyList的實例聲明為Class Semigroup和Class Monoid

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM