美文网首页Haskell
[Haskell] newtype

[Haskell] newtype

作者: 何幻 | 来源:发表于2016-03-04 07:14 被阅读265次

——以下译自《Real World Haskell》P157

<u></u>newtype关键字,用来给已存在的类型,设置一个新的身份。
<u></u>newtypedata限制更多,newtype只能有一个值构造器,且这个值构造器只能有一个字段

反例:

-- no fields
newtype TooFew = TooFew

-- more than one field
newtype TooManyFields = Fields Int Int

-- more than one constructor
newtype TooManyCtors = Bad Int | Worse Int

除此之外,datanewtype还有另外一个区别。
使用data创建的类型,在运行时具有簿记的花销,因为要跟踪该类型的值是由哪个值构造器创建的。
newtype创建的类型,因为只能有一个值构造器,所以没有这种负担,这使得在运行的时候,无论在时间还是空间上都更有效率。

因为newtype的值构造器,只用于编译时,在运行时是不存在的
所以,对于undefined进行模式匹配时,newtype定义类型的值和data定义类型的值,表现方式是不同的。

我们使用data来定义一个DataInt类型,使用newtype来定义一个NewtypeInt类型

data DataInt = D Int
deriving (Eq, Ord, Show)

newtype NewtypeInt = N int
deriving (Eq, Ord, Show)

我们知道,undefined如果在运行时被求值,就会导致程序崩溃。

ghci> undefined
*** Exception: Prelude.undefined

[类型DataInt,情况1]
由于Haskell的模式匹配是惰性的,所以如果undefined不需要被求值时,程序不会崩溃。

ghci> case D undefined of D _ -> 1
1

[类型DataInt,情况2]
但是,当undefined必须求值才能完成模式匹配时,程序就会崩溃。

ghci> case undefined of D _ -> 1
*** Exception: Prelude.undefined

我们将以上DataInt类型的值构造器,换成NewtypeInt类型的值构造器N,结果如下:

[类型NewtypeInt,情况1],与[类型DataInt,情况1],相同

ghci> case N undefined of N _ -> 1
1

[类型NewtypeInt,情况2],与[类型DataInt,情况2],不同

ghci> case undefined of N _ -> 1
1

这里程序并不会崩溃,因为在运行时,已经没有NewtypeInt类型的值构造器N了。
对“N _”进行匹配,事实上就是对“_”进行匹配。
而“_”总是会满足匹配条件,所以undefined是不需要被求值的。

相关文章

  • [Haskell] newtype

    ——以下译自《Real World Haskell》P157 newtype关键字,用来给已存在的类型,设置一个新...

  • Three useful monads

    Writer newtype Writer w a = Writer { runWriter :: (a, w) ...

  • 函数式的宗教-00: 认识lisp(clojure)与haske

    总体大纲: lisp与haskell简单介绍 lisp与haskell应用领域 lisp与haskell技术分析 ...

  • monad以及monad的四条定理

    haskell的范畴是hask范畴(haskell的所有类型隶属于hask范畴),所以haskell的所有函子都是...

  • 01 数据类型

    swift中结构体在haskell中的描述 枚举类型在haskell中的描述 枚举携带类型在haskell中描述 ...

  • Haskell学习-函数式编程初探

    原文地址:Haskell学习-函数式编程初探  为什么要学习函数式编程?为什么要学习Haskell?  .net到...

  • Haskell

    [TOC] Haskell GHCI 通过Tab可以自动补全 通过 :browser 模块名称,浏览该模块下的函数...

  • haskell

    我在这里只是表达此刻内心想到的一些事情,或者记录自己关于最近学习生活工作的想法。 从我这一周对haskell的学习...

  • [Haskell] $

    函数“$”称为function application operator,定义如下: 与函数调用不同的是,函数调用...

  • [Haskell] .

    函数“.”称为function composition,定义如下: 我们看到,函数f接受函数g的返回值作为参数。函...

网友评论

    本文标题:[Haskell] newtype

    本文链接:https://www.haomeiwen.com/subject/dlunkttx.html