Existentials(存在类型)

Existentially quantified types(Existentially types,Existentials)是一种将一组类型归为一个类型的方式。
通常在使用 type, newtype, data 定义新类型的时候,出现在右边的类型参数必须出现在左边。
存在类型可以突破此限制。

实例

{-# LANGUAGE ExistentialQuantification #-}data ShowBox = forall s. Show s => SB sheteroList :: [ShowBox]
heteroList = [SB (), SB 5, SB True]

instance Show ShowBox whereshow (SB s) = show sf :: [ShowBox] -> IO ()
f xs = mapM_ print xsmain = f heteroList{-
()
5
True
-}
  • data ShowBox = forall s. Show s => SB s
    数据构造器中(等式右边)的类型参数 s 必须是 Show 的实例类型。
    等式右边(数据构造器)的类型参数 s 没有出现在等式左边(类型构造器) ,故而 ShowBox 类型是一种存在类型。
  • heteroList = [SB (), SB 5, SB True]
    可以看出存在类型将三种类型归为了一种类型,这种用法接近于Java语言中的接口。
Prelude> :set -XExistentialQuantification
Prelude> :set -XRankNTypes
Prelude> newtype Pair a b = Pair {runPair :: forall c. (a -> b -> c) -> c}
Prelude> makePair a b = Pair $ \f -> f a b
Prelude> pair = makePair "a" 'b'
Prelude> :t pair
pair :: Pair [Char] Char
Prelude> runPair pair (\x y -> x)
"a"
Prelude> runPair pair (\x y -> y)
'b'

Haskell语言学习笔记(73)Existentials相关推荐

  1. Haskell语言学习笔记(30)MonadCont, Cont, ContT

    MonadCont 类型类 class Monad m => MonadCont m wherecallCC :: ((a -> m b) -> m a) -> m a ins ...

  2. Haskell语言学习笔记(41)Parsec(1)

    Parsec Parsec是一个词法及语法分析器. 匹配字符与字符串 Prelude Text.Parsec> parseTest anyChar "a" 'a' Prelu ...

  3. C语言如何加缓冲,C语言学习笔记之输出缓冲

    在c语言中经常用到输出函数printf,当我们像往常一样在输出函数中输入我们的想要的输出的东西后加\n换行 验证结果如我们输出的一样 如果我们在后面加入死循环会不会出现这些语句呢 结果卡死了,可还是输 ...

  4. R语言学习笔记——高级篇:第十四章-主成分分析和因子分析

    R语言 R语言学习笔记--高级篇:第十四章-主成分分析和因子分析 文章目录 R语言 前言 一.R中的主成分和因子分析 二.主成分分析 2.1.判断主成分的个数 2.2.提取主成分 2.3.主成分旋转 ...

  5. 梓益C语言学习笔记之链表&动态内存&文件

    梓益C语言学习笔记之链表&动态内存&文件 一.定义: 链表是一种物理存储上非连续,通过指针链接次序,实现的一种线性存储结构. 二.特点: 链表由一系列节点(链表中每一个元素称为节点)组 ...

  6. 6.方法(go语言学习笔记)

    6.方法(go语言学习笔记) 目录 定义 匿名字段 方法集 表达式 1. 定义 方法是与对象实例绑定的特殊函数. 方法是面向对象编程的基本概念,用于维护和展示对象的自身状态.对象是内敛的,每个实例对象 ...

  7. 梓益C语言学习笔记之指针

    梓益C语言学习笔记之指针 一.32位平台下,地址是32位,所以指针变量占32位,共4个字节 二.内存单元的地址即为指针,存放指针的变量称为指针变量,故:"指针"是指地址,是常量,& ...

  8. c语言中void arrout,c语言学习笔记(数组、函数

    <c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...

  9. c语言float二进制输出代码_C语言学习笔记——学前知识概述

    将我大一学习C语言时做的笔记拿来与大家分享,内容比较浅显,比较适合初学者,如有错误还请见谅,提出改正,谢谢! 前言:此C语言笔记是本人在自学时记录的一些重点或初学者常犯的错误,希望我的这本笔记能够对大 ...

最新文章

  1. linux时间 a x z,关于linux的命令一个莫名的想法,a到z有哪些命令
  2. CSS之【字体/文本样式】
  3. primefaces_使用PrimeFaces开发数据导出实用程序
  4. mac地址和ip地址的区别(转)
  5. pdf.js 文字丢失问题 .cmaps
  6. 04-Fibonacci
  7. echart vue 图表大小_vue中echarts图表大小适应窗口大小且不需要刷新案例
  8. pthread_mutex_lock的作用
  9. 菜鸟学Linux 第055篇笔记 php基础
  10. 软件测试文档测试用例,软件测试用例文档模板(带实例)
  11. 可变数据(VDP)软件 数码印刷和传统印刷的区别
  12. pyspark groupby 后将遍历的每一行转成pandas df
  13. 2020Pyton开发者日线上技术峰会主题:爬虫框架的技术实现与模块应用的经验分享
  14. UE5 C++ Rider 编程指南 1.编辑器基础
  15. 从南沙图书馆到故宫博物院,隐藏着怎样的未来世界?
  16. STM8-STVD+Cosmic编译输出信息参数配置
  17. 批归一化《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
  18. FL Studio 21最新中文版安装教程
  19. 多路复用之——epoll
  20. Halcon17完美破解兼容17.12.0.0附破解说明

热门文章

  1. 阿衰小冲用计算机,猫小乐:阿衰错把充电电池当成废旧电池扔进回收箱,惹怒小冲了...
  2. Python的整数与浮点数计算
  3. C51模拟PS2键盘(四)
  4. Pyramid Mask Text Detector阅读笔记
  5. 卷积核大小对网络参数和计算量的影响
  6. 在MFC对话框中使用Google地图
  7. Excel 注解介绍.第一篇
  8. K-means与DBSCAN聚类算法
  9. delta机器人 寸拳_《这就是寸劲?》第四章
  10. 图论中的聚类系数(Clustering coefficient)简单介绍