Haskell 创建Ord类的新类型实例

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

由于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
        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