首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨类型类实例使用类型约束

跨类型类实例使用类型约束
EN

Stack Overflow用户
提问于 2018-01-05 21:11:20
回答 1查看 62关注 0票数 0

我正在尝试定义一个类型类Plotable,它提供了一个函数plotable来返回表示图表(x,y)中坐标的元组,如果xy的类型不一定是特定的(即Double),我认为它们可以是任何number类型(它们被移交给Chart)。

我希望plotable能够处理Num a => Complex aNum a => (a, a),所以我写道:

代码语言:javascript
复制
class Plotable a where
  plotable :: Num b => a -> (b, b)

instance Num a => Plotable (a, a) where
  plotable = id

instance Num a => Plotable (Complex a) where
  plotable c = (realPart c, imagPart c)

这对我来说是有意义的,但是我得到了错误:

代码语言:javascript
复制
Couldn't match type ‘a’ with ‘b’
  ‘a’ is a rigid type variable bound by
    the instance declaration
    at /Users/dan.brooks/Code/haskell/coding-the-matrix/src/TheField/Plot.hs:12:10-33
  ‘b’ is a rigid type variable bound by
    the type signature for:
      plotable :: forall b. Num b => (a, a) -> (b, b)
    at /Users/dan.brooks/Code/haskell/coding-the-matrix/src/TheField/Plot.hs:13:3-10
  Expected type: (a, a) -> (b, b)
    Actual type: (b, b) -> (b, b)

但是,如果a被约束为Num,而b被约束为Num,那么传递相同的值在这种情况下应该可以吗?这仅仅是compilier的一个限制吗?或者我误用了类型类和类型约束?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-05 21:16:10

代码语言:javascript
复制
plotable :: Num b => a -> (b, b)

意味着其中的任何一个都必须键入check

代码语言:javascript
复制
plotable :: a -> (Int, Int)
plotable :: a -> (Integer, Integer)
plotable :: a -> (Double, Double)
...

换句话说,多态类型向用户承诺,plotable可以使用用户可以选择任何数值类型的b

id :: a -> a不允许用户选择b,所以它不够通用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48114347

复制
相关文章

相似问题

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