首页 > 其他分享 >类型类Type classes(第一部分)类约束 Eq、Ord、Show、Read、Enum、Num、Integral、Floating

类型类Type classes(第一部分)类约束 Eq、Ord、Show、Read、Enum、Num、Integral、Floating

时间:2023-04-01 16:23:03浏览次数:47  
标签:20 函数 Show Read read Num 类型 Eq

类型类Type classes是一种定义某种行为的接口。如果类型是类型类的成员,则意味着类型支持并实现了类型类定义的行为。

类约束

== 函数的类型,如下

:type (==)
(==) :: Eq a => a -> a -> Bool

=>符号定义了一个类约束,==函数接受两个相同类型的形参,并返回Bool类型。这两个形参的类型必须是Eq类型类的成员(类约束)

Eq类型类

Eq类型类提供了相等比较的接口,任何有意义比较两个值是否相等的类型都必须是Eq类型类的成员

除了IO类型(处理输入/输出的类型)和函数之外的所有Haskell标准类型都是Eq类的一部分

Ord类型类

除了函数以外,所有类型都是Ord类型类的一部分,Ord类型类涵盖了>, <, >=, <=等所有比较函数

compare函数,如下

:type compare
compare :: Ord a => a -> a -> Ordering

compare函数接受Ord类型类中相同类型的两个成员,并返回它们的顺序
顺序由Ordering类型表示,该类型可以有三个不同的值,GT、EQ、LT,分别表示大于、等于、小于,如下

5 `compare` 3
GT
'a' `compare` 'z'
LT

Show类型类

除了函数以外,所有的类型都是Show类型类的一部分
该类型类使用最多的函数是show函数,它接受属于Show类型类的值,并将其表示为文本字符串,如下

:type show
show :: Show a => a -> String
show 3
"3"
show True
"True"
show [1, 2, 3]
"[1, 2, 3]"

Read类型类

除了函数以外,所有的类型都是Read类型类的一部分,Read类型类就像与Show相反的类型类
read函数接受一个字符串,并返回一个属于Read成员类型的值,如下

read "True" || False
True
read "8.2" + 3.8
12.0
read "[1,2,3,4]" ++ [5]
[1,2,3,4,5]

read函数,如下

:type read
read :: Read a => String -> a

read函数返回一个属于Read类型类的类型,但如果不在其他地方使用它,则无法知道它具体是什么类型,因此我们需要使用显式类型注释
通过在表达式的末尾添加::,然后指定类型来做到这一点,如下

read "5" :: Int
5
read "5" :: Float
5.0
read "[1,2,3,4]" :: [Int]
[1,2,3,4]

Enum类型类

Enum类型类的成员是按顺序排序的类型,它们可以被枚举,可以使用succ函数和pred函数

Num类型类

Num是数字的类型类,它的成员具有能够表现得像数字的特性,如下

:type 20
(20) :: Num a => a

所有的数字都是多态常数,它们可以充当Num类的任何类型,如下

20 :: Int
20
20 :: Integer
20
20 :: Float
20.0
20 :: Double
20.0

Integral类型类

Integral也是一个数字类型类

  • Num类型类包括所有的数字,实数和整数
  • Integral只包括整数,Int类型和Integer类型是该类型类的成员

一个非常有用的处理整数的函数是fromIntegral,如下

:type fromIntegral
fromIntegral :: (Integral a, Num b) => a -> b

接受一个整数,并将其转换为一个Num类型类的数字

Floating类型类

Floating类型类只包含Float类型和Double类型

标签:20,函数,Show,Read,read,Num,类型,Eq
From: https://www.cnblogs.com/muyangui/p/17278795.html

相关文章

  • 解决tabix建索引报错[E::hts_idx_push] Unsorted positions on sequence #
    当我对两个基因型文件位置取交集,并重新生成两个vcf:$bcftoolsview-Roverlap.lstvariant.filter.vcf.gz-Oz-o300.vcf.gz出现如下错误:$tabix300.vcf.gz[E::hts_idx_push]Unsortedpositionsonsequence#4:29013869followedby29013853tbx_index_buildfailed:300.......
  • 40、K8S-安全机制-准入机制之LimitRanger、ResourceQuota、PodSecurityPolicy(PSP)
    1、基础知识1.1、准入机制1.1.1、简介所谓的"准入机制",指的是经过了用户认证、角色授权之后,当进行一些写操作的时候,需要遵循的一些原则性要求。准入机制有一大堆的"准入控制器"组成,这些准入控制器编译进kube-apiserver二进制文件,由集群管理员进行配置。这些控制器中,最......
  • Django: @login_required
    Django:Tweaking@login_requireddecorator我想为我的网站开始一个私人Beta版。我有一个初始页面,用户可以在其中输入代码,然后访问网站的其余部分。当前,所有其他站点页面(初始页面除外)都包含一系列通过要求用户登录(通过@login_required装饰器)设置的重定向。我希望登录......
  • 项目一众筹网05_03_树的节点的增删改查、radio、代码里面实现模拟用户点击重置、每次
    系列文章目录文章目录系列文章目录18-添加子节点-目标和思路19-添加子节点-前端:打开模态框20-添加子节点-前端:发送Ajax请求==代码里面实现模拟用户点击重置==21-添加子节点-后端==bug发现异步的问题:每次加载数据的时候都要考虑一下异步的问题==22-更新节点-目标和思路23-更新节点......
  • 项目一众筹网04_4_角色维护删除_单条删除和批量删除怎么实现_确认提示,,你真的要删除吗_
    角色维护删除系列文章目录文章目录角色维护删除系列文章目录22-删除-目标和思路(下一篇)单条删除和批量删除怎么实现批量删除和单条删除合成一套思路图23-后端==在这里我们就@RequestBody和@ResponseBody都用到了==24-前端-打开模态框25-前端-执行删除如何判断代码是否是动态生成的前......
  • 【Azure 应用服务】在创建App Service时,遇见“No available instances to satisfy thi
    问题描述在创建新的AppService,遇见了资源不满足当前需求的提示。详细消息为:"Code":"Conflict","Message":"Noavailableinstancestosatisfythisrequest.AppServiceisattemptingtoincreasecapacity.Pleaseretryyourrequestlater.Ifurgent,thi......
  • Mac 上启动nacos 出现异常java.lang.IllegalArgumentException: the length of secret
    这个异常提示是因为Nacos的配置中加密相关的参数未正确填写所导致的。我们只需要找到nacos/conf/application.properties文件,然后给nacos.core.auth.plugin.nacos.token.secret.key这个属性配置一个大于32位的随机字符串即可这个字符串大家可以在jwt的官网去生成:https://jwt.......
  • @RequestBody使用与否的差别
    ......
  • uni.request拦截器
    uni.requset1uni.request({2url:'',//地址3data:{},//请求body4header:{},//请求header5method:'',//请求方式'GET'/'POST'/'PUT'/'DELETE'6success:(res)=>{},//请求成功回调7fail:......
  • [ARC128D] Neq Neq 题解
    不难考虑设\(f_i\)表示现在处理了前\(i\)个数,第\(i\)个数必选得到的方案数。由于\(a_n\)不可能被删掉(需要一个\(a_{n+1}\)),所以答案即为\(f_n\)。对\(f_i\),我们考虑前一个被保留的数\(j\),问题转化成被\(i,j\)夹住的一段连续的数可不可以全部删掉,分类讨论:\(j=i-1\)......