簡體   English   中英

無法推斷(Semigroup(可選a))由實例聲明的超類引起

[英]Could not deduce (Semigroup (Optional a)) arising from the superclasses of an instance declaration

來自“Haskell編程:來自第一原理”的以下代碼無法編譯:

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的半群實例並定義“<>”。 這對我來說沒有多大意義,並且想知道是否有一些我忽略的東西。

注意:Semigroup是Monoid的超類,因為基數為4.11.0.0。

超級班的名單一直在緩慢發展。 隨着新的有用類的提出,更新舊類的API以反映它們之間的關系。 這有破壞舊代碼的不幸影響。 基礎4.11.1.0於2018年4月發布,對Monoid進行了這一重大改變。

這是解決方案:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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