首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据构造器-相同类型

数据构造器-相同类型
EN

Stack Overflow用户
提问于 2014-11-01 01:02:47
回答 1查看 64关注 0票数 1

鉴于以下数据类型:

代码语言:javascript
复制
data JoinList m a = Empty
                  | Single m a
                  | Append m (JoinList m a) (JoinList m a)
    deriving (Eq, Show)

使用ghci,我做到了:

代码语言:javascript
复制
*JoinList> :t Single 5 3
Single 5 3 :: (Num m, Num a) => JoinList m a

为什么这里需要两种Num类型?既然这两种类型都是Num,那么为什么我们不能拥有:

Single 5 3 :: (Num m) => JoinList m m

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-01 01:07:14

他们不是同一类型的。

您允许在JoinList的定义中更改类型,并且在类型签名中没有断言5和3是相同的Num。

代码语言:javascript
复制
GHCi, version 7.8.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :l joinlist.hs
[1 of 1] Compiling JoinList         ( joinlist.hs, interpreted )
Ok, modules loaded: JoinList.
Prelude> :t Single 5 3
Single 5 3 :: (Num a, Num m) => JoinList m a
Prelude> let same = Single 5 3 :: Num a => JoinList a a
Prelude> :t same
same :: Num a => JoinList a a

因为文字是多态的Num值,所以它们可以是遮罩下的两种不同的具体类型。

代码语言:javascript
复制
Prelude> let diff = Single 5 3 :: JoinList Int Float
Prelude> diff
Single 5 3.0
Prelude> :t diff
diff :: JoinList Int Float
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26685327

复制
相关文章

相似问题

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