首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于单半群类的进一步问题

关于单半群类的进一步问题
EN

Stack Overflow用户
提问于 2020-07-11 10:59:37
回答 1查看 149关注 0票数 0

我试图利用Semigroup类型化来玩玩单子,并且我试图在自然数上定义一个单子。我将以下类和实例声明放入GHCI中

代码语言:javascript
复制
Prelude:{
Prelude| class Semigroup a where
Prelude|    (<>) :: a -> a -> a)
Prelude| newtype Sum a = Sum { getSum :: a }
Prelude|     deriving (Eq, Ord, Show)
Prelude| instance Num a => Monoid (Sum a) where
Prelude|    (<>) = coerce ((+) :: a -> a -> a)
Prelude| instance Num a => Monoid (Sum a) where
Prelude|     mempty = Sum 0
Prelude| :} 

我收到这样的信息:

代码语言:javascript
复制
<interactive>:7:4: error:
Ambiguous occurrence ‘<>’
It could refer to either ‘Prelude.<>’,
                         imported qualified from ‘Prelude’
                         (and originally defined in ‘GHC.Base’)
                      or ‘<>’, defined at <interactive>:3:4

然后我输入了import qualified Prelude as P,以避免冲突,但这不起作用,我得到了错误消息:

代码语言:javascript
复制
code<interactive>:26:19: error:
Not in scope: type constructor or class ‘Monoid’
Perhaps you meant one of these:
  ‘P.Monoid’ (imported from Prelude),
  ‘P.Monad’ (imported from Prelude) 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-11 11:06:50

你不应该自己定义类型。它已经被定义了,通过定义另一个函数,这意味着您的所有(<>)函数等等现在都可以指向您定义的Semigroup或在Prelude中定义的那个。

因此,您可以定义您的类型并使其成为SemigroupMonoid的实例,并使用:

代码语言:javascript
复制
import Data.Semigroup

newtype Sum a = Sum { getSum :: a } deriving (Eq, Ord, Show)

instance Num a => Semigroup (Sum a) where
    Sum a <> Sum b = Sum (a + b)

instance Num a => Monoid (Sum a) where
    mempty = Sum 0
    mappend = (<>)

因此,如果我们在shell中运行这个程序,就会得到:

代码语言:javascript
复制
Prelude> import Data.Semigroup
Prelude Data.Semigroup> :{
Prelude Data.Semigroup| newtype Sum a = Sum { getSum :: a } deriving (Eq, Ord, Show)
Prelude Data.Semigroup| 
Prelude Data.Semigroup| instance Num a => Semigroup (Sum a) where
Prelude Data.Semigroup|     Sum a <> Sum b = Sum (a + b)
Prelude Data.Semigroup| 
Prelude Data.Semigroup| instance Num a => Monoid (Sum a) where
Prelude Data.Semigroup|     mempty = Sum 0
Prelude Data.Semigroup|     mappend = (<>)
Prelude Data.Semigroup| :}
Prelude Data.Semigroup> Sum 0 <> Sum 1 <> Sum 4 <> Sum 5
Sum {getSum = 10}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62848292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档