首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >haskell 中的newtype

haskell 中的newtype

作者头像
Orlion
发布于 2024-09-02 08:22:21
发布于 2024-09-02 08:22:21
45310
代码可运行
举报
文章被收录于专栏:我的独立博客我的独立博客
运行总次数:0
代码可运行

haskell中一般使用data关键字来自定义type,像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data BookInfo = Book Int String [String] deriving (Show)

但有些情况下要使用newtype来定义, 举个例子,对于数字来说,它有两种选择可以表现为一个monoid,一个是 * 作为二元函数,1 作为identity, 另外一种是 + 作为二元函数,0 作为identity。那么问题来了怎么把这两种选择都实现 (这里所说的实现是指把一个数字实现为Monoid这个typeclass的instance) 呢?

Data.Monoid 这个模块导出了两个类型:ProductSum 。Product的定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Prelude Data.Monoid> :i Product
newtype Product a = Product {getProduct :: a}

Sum的定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Prelude Data.Monoid> :i Sum
newtype Sum a = Sum {getSum :: a}

Product的Monoid的instance实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
instance Num a => Monoid (Product a) where  
    mempty = Product 1  
    Product x `mappend` Product y = Product (x * y)

很显然它将第一种选择即乘法实现了。它代表 Product a 对于所有属于 Numa 是一个 Monoid

为什么要用newtype呢?

因为newtype比较快。 如果用data的话在执行的时候会有包起来和解开来的成本,但使用newtype的话,Haskell会知道你只是要将一个type包成一个新的type,你想要内部运作完全一样只是要一个新type而已。有了这个概念,Haskell可以将包裹和解开的成本省掉。

为什么不能所有地方都用newtype呢,是因为当使用newtype来制作一个新type的时候,只能有一个值构造器,而且这个值构造器只能有一个字段。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
谢谢分享
谢谢分享
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
[MYSQL] 修改字段长度的时候不能使用instant算法? 那就定制一个?
我们知道mysql 8.0.12引入了instant算法, 部分DDL只需要修改元数据信息即可完成修改, 这样速度是嘎嘎快. 但是支持有限, 大概如下:
大大刺猬
2025/07/25
1130
[MYSQL] 修改字段长度的时候不能使用instant算法? 那就定制一个?
MYSQL INNODB ibd文件详解 (2) 提取DDL和DML
mysql数据和索引是放一起的, 主键索引记录主键值和剩余字段值, 二级索引(普通索引)记录 索引值和主键值.
大大刺猬
2023/04/24
1.2K1
MYSQL INNODB ibd文件详解 (2)  提取DDL和DML
mysql 寻找SDI PAGE
对于原本就是8.0环境的ibd文件, 第4页就是SDI PAGE, 之前的ibd2sql也是直接解析第四页得到的.
大大刺猬
2023/10/13
3330
[MYSQL] REDUNDANT行格式的数据解析
mysql的行格式有4种,REDUNDANT,COMPACT,DYNAMIC和COMPRESSED. 最常用的就是DYNAMIC, 也是mysql默认的行格式(很早只有REDUNDANT). 该行格式虽然复杂一点, 但是支持的索引前缀可达3072字节.(REDUNDANT只支持到768字节).
大大刺猬
2024/12/06
3360
[MYSQL] REDUNDANT行格式的数据解析
MYSQL INNODB ibd文件详解 (3) FIL_PAGE_SDI
虽然上一章已经提取了DDL, 但是存储DDL的sdi页还没有讲.... 现在补上呗..
大大刺猬
2023/04/25
1K2
MYSQL INNODB ibd文件详解 (3) FIL_PAGE_SDI
[MYSQL] mysql.ibd 文件解析 (sdi page) (非debug模式下查看隐藏系统表)
在mysql 8.0版本,系统表的存储引擎由myisam改为了innodb, @@datadir/mysql目录下一堆的数据文件通通放到@@datadir/mysql.ibd文件中了. 但很多表在非debug模式下是无法查看里面的数据的. 这TM就很恼火. (刚学完innodb的磁盘结构, 我能受这气?). 所以我们现在来解析下mysql.ibd文件. (也顺便为 ibd2sql 2.0 做准备)
大大刺猬
2024/09/18
1K0
[MYSQL] mysql.ibd 文件解析 (sdi page) (非debug模式下查看隐藏系统表)
[Linux&MYSQL] xfs文件系统浅析 -- 恢复drop的表
我们知道ibd2sql可以解析ibd文件从而恢复mysql的数据, 但没得ibd文件的时候又该怎么办呢? (哎呀, 不小心drop了表, 又没得备份!)
大大刺猬
2024/10/15
5112
[Linux&MYSQL]  xfs文件系统浅析 -- 恢复drop的表
[MYSQL] mysql 参数lower_case_table_names的修改
该参数默认是0, 即区分大小写. 但现在又想要不区分大小写了. 也就是想设置其值为1. 首先我们要确保数据库里面的表均为小写, 我们可以通过如下sql查询
大大刺猬
2024/09/11
1.5K0
[MYSQL] mysql 参数lower_case_table_names的修改
[MYSQL] mysql数据加密原理和解析
上一章我们讲了mysql压缩原理(含lz4压缩格式)并解析, 细心的同学应该发现旁边就是加密的相关代码. 那本章就来讲讲mysql加密和解析.
大大刺猬
2024/09/27
7700
[MYSQL] mysql数据加密原理和解析
[MYSQL] mysql坏块检查
当mysql存在坏块的时候, 查询对应的表就会报错,然后数据库就crash了. 比如:
大大刺猬
2024/08/22
7430
[MYSQL] mysql坏块检查
MySQL-8.0 | 数据字典最强解读
数据字典(Data Dictionary)中存储了诸多数据库的元数据信息如图1所示,包括基本Database, table, index, column, function, trigger, procedure,privilege等;以及与存储引擎相关的元数据,如InnoDB的tablespace, table_id, index_id等。MySQL-8.0在数据字典上进行了诸多优化,本文将对其进行逐一介绍。
数据和云
2019/05/13
4.2K0
[MYSQL] varchar长度修改时online DDL能够使用哪种算法?
本文将从Innodb存储结构来分析 varchar 字段长度变化在哪些情况使用哪种online DDL算法
大大刺猬
2024/11/21
2853
[MYSQL] varchar长度修改时online DDL能够使用哪种算法?
[ibd2sql] ibd2sql v1.4 新增支持溢出页, 子分区
ibd2sql是一个使用python3编写的离线解析MYSQL INNODB存储引擎的ibd文件的工具. 无第三方依赖包, 纯python3代码. 使用GPL-3.0 license.
大大刺猬
2024/05/21
3770
详解MySQL-8.0数据字典
提示:公众号展示代码会自动折行,建议横屏阅读 ---- 1. 引言 ---- 数据字典(Data Dictionary)中存储了诸多数据库的元数据信息如图1所示,包括基本Database, table, index, column, function, trigger, procedure,privilege等;以及与存储引擎相关的元数据,如InnoDB的tablespace, table_id, index_id等。MySQL-8.0在数据字典上进行了诸多优化,本文将对其进行逐一介绍。 图1 2.
腾讯数据库技术
2019/05/16
6.9K0
详解MySQL-8.0数据字典
MySQL 8.0新特性: 数据字典
目前MySQL 8.0最新版本为8.0.23版本,针对8.0的新特性,从春节前开始做了一些相关学习和测试,后续会不阶段的分享一些8.0的新特性,供大家一起参考和学习;
SEian.G
2021/03/03
2.4K0
[ibd2sql] ibd2sql v1.0 发布 & ibd文件结构说明
修复了一些之前的问题, 比如做过online ddl (instant)的表解析的时候就需要注意record header的第2bit 标记位.
大大刺猬
2024/01/09
1.1K0
[ibd2sql] ibd2sql v1.0 发布 & ibd文件结构说明
MYSQL] mysql坏块检查
当mysql存在坏块的时候, 查询对应的表就会报错,然后数据库就crash了. 比如:
用户10864049
2024/08/24
3740
mysql提升10倍count(*)的神器
之前做数据迁移之后, 关于数据的一致性校验, 我们是使用checksum来做的, 也可以使用count(*), 但是都比较慢. 而数据校验的时候, 数据实际上是静态的, 没有业务使用的, 欸, 那我们是不是就可以自己来统计行数呢?
大大刺猬
2025/03/21
3840
mysql提升10倍count(*)的神器
MYSQL INNODB ibd文件详解 (1)
每个ibd文件包含1个(不考虑ibdata)表空间(一张表), 每个表空间包含若干个segment. 每个segment对应一个索引的叶子节点/非叶子节点. 也就是每2个segment对于一个索引. 每个segment对于n个区(空间分配是按照区来的). 每个区(extent)对于n个page. 为了方便管理区, 每256个区会使用一个page(XDES:EXTENT DESCRIPTOR)来记录相关信息. (是不是都晕了... 不慌,后面有图)
大大刺猬
2023/04/22
3.1K0
MYSQL INNODB ibd文件详解 (1)
[MYSQL] frm2sdi (2) sdi内容讲解
除了在数据字典中有元数据信息外, mysql还在ibd里面存储了该数据文件对应的表的元数据信息.这部分信息就叫做 Serialized Dictionary Information (SDI). 数据格式是我们常见的json格式.
大大刺猬
2025/01/20
3710
相关推荐
[MYSQL] 修改字段长度的时候不能使用instant算法? 那就定制一个?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验