0

我有一个看起来像这样的模块:

module Network where
import Prelude hiding ((==))
import Sort
import Message

data Pair = Conn Loc Loc | Disconn Loc Loc deriving(Show,Eq)
data NC = EmpNC | Inn Pair NC 

instance Eq NC where
EmpNC == EmpNC = True
(Inn p nc1) == nc2 = (nc_include p nc2) && (nc1 == nc2)
_ == _ = False

nc_include::Pair->NC->Bool
nc_include p EmpNC = False
nc_include p1 (Inn p2 nc) = (p1 == p2) || (nc_include p1 nc)

奇怪的是,对于我说的最后一行(p1 == p2) ,我无法将预期类型 NC 与实际类型对错误匹配。这意味着 p1 应该是 NC 而不是 Pair。我不知道,你能帮忙吗? [编辑] 隐藏(==)形式的前奏是因为无论我有“==”运算符,我都会遇到歧义错误。如果您也为此提出更好的解决方案,我将不胜感激:D

4

1 回答 1

12

首先,这是一个工作版本:

module Network where

data Loc = Loc deriving (Show, Eq)
data Pair = Conn Loc Loc | Disconn Loc Loc deriving(Show,Eq)
data NC = EmpNC | Inn Pair NC 

instance Eq NC where
   EmpNC       == EmpNC = True
   (Inn p nc1) == nc2   = (nc_include p nc2) && (nc1 == nc2)
   _           == _     = False

nc_include :: Pair -> NC-> Bool
nc_include p  EmpNC = False
nc_include p1 (Inn p2 nc) = (p1 == p2) || (nc_include p1 nc)

有什么区别(除了我的任意定义Loc)?主要是格式化。

我想发生的事情是这样的:

你试图写一个Eqfor的实例NC

instance Eq NC where
EmpNC == EmpNC = True
...

并意识到编译器不喜欢这个,说它(==)Prelude. 但是,您从中得出了错误的结论,隐藏Prelude.(==)并继续。现在编译器没有抱怨,但它解析了你做了这样的事情:

instance Eq NC where -- make NC an instance of Eq with only default definitions

EmpNC == EmpNC = True -- define a new function (==) of type (NC -> NC -> Bool)
...

这就是为什么现在你不能应用(==)Pairs,因为它的类型是(NC -> NC -> Bool),因此编译器告诉你它会期望 anNC而不是 a Pair

现在,问题的核心是实例定义遵循空白格式规则,因此您必须在定义中的函数之前至少保留一个空白列instance

instance Eq NC where 
 EmpNC == ...

工作,而

instance Eq NC where 
EmpNC == ...

没有。

其他一些东西也是如此,比如,class等。docase

于 2013-08-22T09:19:38.167 回答