Haskell 创建Ord类的新类型实例
由于Ord是Eq的一个子类,我发现很难理解如何创建该类的新类型实例 我已设法做到这一点:Haskell 创建Ord类的新类型实例,haskell,Haskell,由于Ord是Eq的一个子类,我发现很难理解如何创建该类的新类型实例 我已设法做到这一点: newtype NT1 = NT1 Integer instance Eq NT1 where (NT1 x) == (NT1 y) = x == y instance Ord NT1 where (NT1 x) `compare` (NT1 y) = x `compare` y instance Show NT1 where
newtype NT1 = NT1 Integer
instance Eq NT1 where
(NT1 x) == (NT1 y) = x == y
instance Ord NT1 where
(NT1 x) `compare` (NT1 y) = x `compare` y
instance Show NT1 where
show (NT1 n) = show n
例如,如果我有一个变量x=nt15
和变量y=nt15
并键入x==y,它将返回True
我也设法做到了这一点:
newtype NT1 = NT1 Integer
instance Eq NT1 where
(NT1 x) == (NT1 y) = x == y
instance Ord NT1 where
(NT1 x) `compare` (NT1 y) = x `compare` y
instance Show NT1 where
show (NT1 n) = show n
将x=NT1 5
显示为5
而不是NT1 5
在这之后,我应该能够做这样的事情:
instance Ord NT1 where
(>) (NT1 x)(NT1 y) = (NT1 x) > (NT1 y)
(<) (NT1 x)(NT1 y) = (NT1 x) < (NT1 y)
(<=) (NT1 x)(NT1 y) = (NT1 x) <= (NT1 y)
(>=) (NT1 x)(NT1 y) = (NT1 x) >= (NT1 y)
实例Ord NT1,其中
(>)(NT1 x)(NT1 y)=(NT1 x)>(NT1 y)
(
在这之后,我应该能够做这样的事情:
instance Ord NT1 where
(>) (NT1 x)(NT1 y) = (NT1 x) > (NT1 y)
(<) (NT1 x)(NT1 y) = (NT1 x) < (NT1 y)
(<=) (NT1 x)(NT1 y) = (NT1 x) <= (NT1 y)
(>=) (NT1 x)(NT1 y) = (NT1 x) >= (NT1 y)
这意味着你说的是nt1x>nt1y
,给定nt1x>nt1y
,但这当然没有任何作用
很好的一点是,您不需要定义所有这些函数:Haskell已经在Ord
typeclass中根据其他函数构造了许多其他函数,因此如果我们看一下,我们会看到:
最小完整定义
compare | (<=)
因此就足够了,例如:
Prelude> NT1 14 < NT1 25
True
因此,我们在这里“自动”实现Eq
、Ord
和Show
typeclass。对于Show
,它首先显示构造函数的名称,然后显示参数的Show
。在某些情况下,它还添加了括号,这是不明确的(尽管规则有点复杂)
我们还可以自己实现这些功能,包括:
instance Ord NT1 where
compare (NT1 x) (NT1 y) = compare x y
(>) (NT1 x)(NT1 y) = x > y
实例Ord NT1,其中
比较(NT1 x)(NT1 y)=比较x y
(>)(NT1 x)(NT1 y)=x>y
因此,这里我们不使用右侧的NT1
数据构造函数调用此函数,因为否则我们将使用相同的参数再次调用此函数
但是在构造函数中包装的参数上。注意,在它起作用的情况下,等式右侧没有NT
。我很困惑。你说“我应该可以做这样的事情”,然后发布定义操作本身的代码。为什么您希望这样做?您的意思是只在右侧添加例如x>y
,而不使用NT1
包装的版本吗?我已将您的帖子回滚到早期版本。请不要对您的问题进行大量编辑,以更改您使用的代码We’我们请求帮助。如果您在评论中找到了答案,请将其作为自己的答案发布;或者如果您已经克服了当前的障碍,有了新问题,请将其作为新的单独问题发布。@amalloy我在帖子的开头添加了我的问题,并将原始问题保留在下面并标记我不明白问题出在哪里?当我自己不确定答案是否正确时,为什么我要将其作为答案发布?@cheshire的确,我看到旧内容仍然存在——感谢您尝试确保您不会删除有用的内容。但读者看到的第一件事仍然让人困惑“更新”到下面的文本,他们甚至还没有读过!他们必须滚动浏览您的更新,阅读原始帖子,返回到您的更新,并尝试在头脑中将其拼凑在一起。最好将您的候选解决方案作为答案发布,即使您不知道它是正确的。每天堆栈溢出上都会发布大量错误答案,并且n答案为投票/评论腾出空间……如果你真的想自己实现所有的Ord
方法,不管出于什么原因,你都可以(>)(NT x)(NT y)=(>)x y
(右边没有NT
包装器).或者,按照预期的方式使用中缀符号,ntx>nty=x>y
@DanielWagner:事实上,在重读之后,它丢失了,谢谢:)
newtype NT1 = NT1 Integer deriving (Show, Eq, Ord)
instance Ord NT1 where
compare (NT1 x) (NT1 y) = compare x y
(>) (NT1 x)(NT1 y) = x > y