热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

制作Ord类的newtype实例

如何解决《制作Ord类的newtype实例》经验,为你挑选了1个好方法。

由于Ord是Eq的一个子类,我发现很难理解如何使该类的newtype实例看起来像.

我设法做到了这一点:

    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 

如果我为考试有一个变量x = NT1 5和变量y = NT1 5并输入x == y它将返回True

我还设法做到了这一点:

instance Show NT1 where
        show (NT1 n) = show n

whill显示x = NT1 55而不是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类执行此操作:

class  (Eq a) => Ord a  where
    compare              :: a -> a -> Ordering
    (<), (<=), (>=), (>) :: a -> a -> Bool
    max, min             :: a -> a -> a



1> Willem Van O..:

在此之后,我应该能够做到这样的事情:

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)

你在这里做的基本上是定义一组函数,其中每个函数调用自身,具有相同的参数,因此这将陷入无限循环.

实际上,例如你在这里定义:

instance Ord NT1 where 
       (>)  (NT1 x)(NT1 y)  =  (NT1 x) >   (NT1 y)

所以这意味着你说NT1 x > NT1 y,给予NT1 x > NT1 y,但当然,这并没有真正做任何事情.

好处是你不需要定义所有这些函数:Haskell已经在Ord类型类中构建了许多其他函数,所以如果我们看一下文档Ord,我们会看到:

最小的完整定义

compare | (<=)

所以实施compare,或者(<=)就足够了.哈斯克尔可以基于该实现,也计算其他的比较,以及min,max等你实现这些,例如,如果有更有效的方法来检查,如果NT1 x 不是调用compare和检查,如果结果LT.

您的实施如下:

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

因此就足够了,例如:

Prelude> NT1 14 

从而正确地比较两个对象.

这也是一个简单的实现,NT1如果构造函数是相同的两个对象是相同的(这里只有一个构造函数),并且参数是一个简单的实现.

Ord 还有一个"流行的"实现:一个对象被认为小于另一个对象,因为第一个对象的构造函数是在第二个对象的构造函数之前定义的,或者如果构造函数是相同的,那么通过比较这些参数,参数会更小"按字典顺序".

Haskell支持这些类型的实现,您可以deriving在类型定义中使用子句:

newtype NT1 = NT1 Integer deriving (Show, Eq, Ord)

在这里,我们因此"自动"执行Eq,OrdShow类型类.因为Show它是通过首先显示构造函数的名称,后跟show参数的名称来实现的.它还在某些情况下添加了括号(尽管规则稍微复杂一些).

我们也可以像@DanielWagner所说的那样自己实现这些功能:

instance Ord NT1 where 
    compare (NT1 x) (NT1 y) = compare x y
    (>)  (NT1 x)(NT1 y)  = x > y

在这里,我们这样做不是与调用该NT1右侧数据构造,因为否则我们就简单地同样具有相同的参数调用此函数.通过上面的实现,我们调用x > y,(>)但是在构造函数中包含的参数.


...如果你真的想要出于任何原因自己实现所有`Ord`方法,你可以`(>)(NT x)(NT y)=(>)xy`(右边没有`NT`包装器).或者,按照预期的方式使用中缀符号,`NT x> NT y = x> y`.
推荐阅读
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了Java中Currency类的getInstance()方法,该方法用于检索给定货币代码的该货币的实例。文章详细解释了方法的语法、参数、返回值和异常,并提供了一个示例程序来说明该方法的工作原理。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
author-avatar
小米-发烧友
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有