Existentials(存在类型)

Existentially quantified types(Existentially types,Existentials)是一种将一组类型归为一个类型的方式。

通常在使用 type, newtype, data 定义新类型的时候,出现在右边的类型参数必须出现在左边。

存在类型可以突破此限制。

实例

  1. {-# LANGUAGE ExistentialQuantification #-}
  2. data ShowBox = forall s. Show s => SB s
  3. heteroList :: [ShowBox]
  4. heteroList = [SB (), SB 5, SB True]
  5. instance Show ShowBox where
  6. show (SB s) = show s
  7. f :: [ShowBox] -> IO ()
  8. f xs = mapM_ print xs
  9. main = f heteroList
  10. {-
  11. ()
  12. 5
  13. True
  14. -}
  • data ShowBox = forall s. Show s => SB s

    数据构造器中(等式右边)的类型参数 s 必须是 Show 的实例类型。

    等式右边(数据构造器)的类型参数 s 没有出现在等式左边(类型构造器) ,故而 ShowBox 类型是一种存在类型。
  • heteroList = [SB (), SB 5, SB True]

    可以看出存在类型将三种类型归为了一种类型,这种用法接近于Java语言中的接口。
  1. Prelude> :set -XExistentialQuantification
  2. Prelude> :set -XRankNTypes
  3. Prelude> newtype Pair a b = Pair {runPair :: forall c. (a -> b -> c) -> c}
  4. Prelude> makePair a b = Pair $ \f -> f a b
  5. Prelude> pair = makePair "a" 'b'
  6. Prelude> :t pair
  7. pair :: Pair [Char] Char
  8. Prelude> runPair pair (\x y -> x)
  9. "a"
  10. Prelude> runPair pair (\x y -> y)
  11. 'b'

Haskell语言学习笔记(73)Existentials的更多相关文章

  1. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  2. Haskell语言学习笔记(79)lambda演算

    lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以 ...

  3. Haskell语言学习笔记(69)Yesod

    Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...

  4. Haskell语言学习笔记(20)IORef, STRef

    IORef 一个在IO monad中使用变量的类型. 函数 参数 功能 newIORef 值 新建带初值的引用 readIORef 引用 读取引用的值 writeIORef 引用和值 设置引用的值 m ...

  5. Haskell语言学习笔记(39)Category

    Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...

  6. Haskell语言学习笔记(72)Free Monad

    安装 free 包 $ cabal install free Installed free-5.0.2 Free Monad data Free f a = Pure a | Free (f (Fre ...

  7. Haskell语言学习笔记(44)Lens(2)

    自定义 Lens 和 Isos -- Some of the examples in this chapter require a few GHC extensions: -- TemplateHas ...

  8. Haskell语言学习笔记(38)Lens(1)

    Lens Lens是一个接近语言级别的库,使用它可以方便的读取,设置,修改一个大的数据结构中某一部分的值. view, over, set Prelude> :m +Control.Lens P ...

  9. Haskell语言学习笔记(92)HXT

    HXT The Haskell XML Toolbox (hxt) 是一个解析 XML 的库. $ cabal install hxt Installed hxt-9.3.1.16 Prelude&g ...

随机推荐

  1. python程序化交易神器——tushare

    一直想试着将自己的交易思路程序化,可惜困难重重 ,连第一步获取数据都要花很多精力,直到最近发现了Tushare,不仅使用非常便利,功能也无比强大,股票.期货.基金.财经新闻,甚至电影票房等都可以非常便 ...

  2. CentOS之文档的压缩与打包

    .rar压缩文件linux中不识别,.zip在windows和Linux中动能使用. .gz:由gzip压缩工具压缩的文件 .bz2:bzip2压缩工具压缩的文件 .tar:由tar打包程序打包的文件 ...

  3. POJ Lost Cows

    [题解] 参考https://blog.csdn.net/acmer_hades/article/details/46272605.设置数组pre_smaller,其中第i个元素即为输入的第i项,则显 ...

  4. javaScrip字符串(String)相关

    -----------------------------------------此页只记录前端关于String的东西----------------------------------------- ...

  5. Devlopment Env Setup install ubuntu16.04

    http://blog.csdn.net/ljheee/article/details/52966048 1.add chinese language support settings -> i ...

  6. vue实现未登录跳转到登录页面

    环境:vue 2.9.3; webpack;vue-router 目的:实现未登录跳转 例子:直接在url地址栏输入...../home,但是这个页面要求需要登陆之后才能进入,判断的值就通过登陆之后给 ...

  7. Django中的分页,cookies与session

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  8. 点不到的NO

    <!DOCTYPE html> <html>     <head>         <meta charset="UTF-8">   ...

  9. vue的异步组件按需加载

    当build打包后,app.js过大的时候,可以考虑用异步组件的方式. import HomeHeader from "./components/Header"; import H ...

  10. demo: 全页面CSS3动画的一个参考例子

    全页面CSS3动画的一个参考例子: http://wow.blizzard.cn/wow/wod-achievement/ 魔兽的一个活动页 第二页.第三页,文字进入页面 <script src ...