' +'不是一个可见的课堂方法

时间:2017-10-10 20:56:32

标签: haskell

我试图在Haskell中制作自定义结构,如下所示:

data Interval = Interval Float Float 
instance Interval Float Float where
(Interval a b) + (Interval c d) = Interval (a + c) (b + d)
(Interval a b) - (Interval c d) = Interval (a - c) (b - d)

但每次都会出现错误,如:

  

' +'不是一种可见的课程方法' Interval'   那我该怎么做呢?

2 个答案:

答案 0 :(得分:7)

您正在混合数据类型定义和类型类。

data Interval = Interval Float Float

定义了一个新的数据类型Interval,但是

instance Interval Float Float where

将尝试创建类型类Interval的实例。

我不确定您的意图,但是如果您想让类型Interval符合Num类型类,该类提供(+)等运算符。那么您会写:

data Interval = Interval Float Float 

instance Num Interval where
  (+) (Interval a b) (Interval c d) = Interval (a + c) (b + d)
  (-) (Interval a b) (Interval c d) = Interval (a - d) (b - c)

请注意,您需要为Num的完整实例实现更多功能。

答案 1 :(得分:2)

你做了什么

data Interval = Interval Float Float 

您要说Interval是一个带有一个构造函数(也称为Interval)的类型,它有两个类型为Float的未命名字段。

instance Interval Float Float where

在这里,您要说Interval是一个类型类(非A类型),它接受您提供的两个类型参数Float。这意味着某处有一行读取class Interval a b where ...

(Interval a b) + (Interval c d) = Interval (a + c) (b + d)
(Interval a b) - (Interval c d) = Interval (a - c) (b - d)

这里,假设你要缩进,你定义了两个函数,它们是Interval类型的方法(不存在),这些方法被命名为+和{{1} }。

您可能打算使用

我想你想要定义一个类型,Interval,你做了。

我认为您想要定义加法和减法,它们是-类型类的方法:

Num