幻像类型如何与newtype一起使用?

克罗基亚

我对新类型的理解是它们是由GHC编译的。但是,这并不是全部,因为幻像类型可以保存信息。

这里

您可以将[a type]包装在新类型中,这将被视为与类型检查器不同,但在运行时相同。然后,您可以使用各种深层欺骗手段,例如幻像或递归类型,而无需担心GHC洗牌的字节桶。

例如,假设有一个表示算术模q的新类型:

newtype Zq q = Zq Int

class Modulus q where
    getModulus :: q -> Int

addZq :: (Modulus q) => Zq q -> Zq q -> Zq q
addZq (Zq a) (Zq b) = Zq $ (a+b) `mod` (getModulus (undefined :: q))

addZq 无法编译为

addZq :: Int -> Int -> Int

那么从什么意义上说新类型被编译出来了,幻象类型信息存储在哪里?

丹尼尔·瓦格纳

要记住的是,您不会“编译”到Haskell;您可以编译成其他更明确的语言-在GHC的情况下,下一个众所周知的降级是核心。而且,尽管您不能在Core中将其编译addZq为某种类型Int -> Int -> Int,但可以将其编译为可以将其编写为的类型Modulus q => Int -> Int -> Int在这种更明确的语言中,=>其含义与Haskell中的含义不同。用这种语言c => t表示的是函数的类型,该函数为索偿要求提供证据(在这种情况下,为类字典)c并产生type t所以Modulus q => Int -> Int -> Int是大致相同的(q -> Int) -> Int -> Int -> Int,并且addZq肯定能够给予这种类型的,甚至在Haskell。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

指针如何与Java中的原始类型一起使用?

来自分类Dev

如何使模板类型推导与引用一起使用?

来自分类Dev

.getClass()。getName()方法如何与int类型一起使用?

来自分类Dev

如何注册将与值类型一起使用的DependencyProperty

来自分类Dev

如何使模板类型推导与引用一起使用?

来自分类Dev

类型推断如何与可选参数一起使用?

来自分类Dev

与对象类型一起使用

来自分类Dev

与MKL一起使用的数组类型

来自分类Dev

如何使强制性类型与类型类一起使用

来自分类Dev

如何在.Net中与不同类型的使用者一起使用RabbitMq消息?

来自分类Dev

如何使用MessageListenerAdapter在Spring amqp中将Pojo与消息类型参数一起使用?

来自分类Dev

如何在.Net中与不同类型的使用者一起使用RabbitMq消息?

来自分类Dev

Autofac:如何使用相同的接口注册多个类型以与装饰器一起使用?

来自分类Dev

_Generic与typedef结构一起使用还是仅与基本类型一起使用?

来自分类Dev

在 Scala 中将类型 lambda 与更高级的类型一起使用:如何让编译器正确推断类型?

来自分类Dev

Keras:如何将fit_generator与不同类型的多个输出一起使用

来自分类Dev

PowerMockito-如何将whenNew()与类型列表一起使用?

来自分类Dev

如何将CsvHelper.CsvWriter与F#选项类型一起使用?

来自分类Dev

了解PDO /预准备语句如何与多种数据库类型一起使用

来自分类Dev

如何正确一起使用size_t和其他整数类型?

来自分类Dev

如何在实体框架中将过程与用户定义的表类型一起使用

来自分类Dev

如何将QSort与QList中的自定义类型一起使用?

来自分类Dev

如何使useRouteMatch与React-Router中的类型一起使用

来自分类Dev

如何使类型类与Scala中的异构列表一起使用

来自分类Dev

如何快速使基类属性通用,以便可以与多种模型类型一起使用?

来自分类Dev

如何将MatSort与Object []类型的表一起使用

来自分类Dev

如何将“ InsertQuery”与常规记录和表类型一起使用

来自分类Dev

如何将CsvHelper.CsvWriter与F#选项类型一起使用?

来自分类Dev

如何使目录变形与参数化/索引类型一起使用?

Related 相关文章

  1. 1

    指针如何与Java中的原始类型一起使用?

  2. 2

    如何使模板类型推导与引用一起使用?

  3. 3

    .getClass()。getName()方法如何与int类型一起使用?

  4. 4

    如何注册将与值类型一起使用的DependencyProperty

  5. 5

    如何使模板类型推导与引用一起使用?

  6. 6

    类型推断如何与可选参数一起使用?

  7. 7

    与对象类型一起使用

  8. 8

    与MKL一起使用的数组类型

  9. 9

    如何使强制性类型与类型类一起使用

  10. 10

    如何在.Net中与不同类型的使用者一起使用RabbitMq消息?

  11. 11

    如何使用MessageListenerAdapter在Spring amqp中将Pojo与消息类型参数一起使用?

  12. 12

    如何在.Net中与不同类型的使用者一起使用RabbitMq消息?

  13. 13

    Autofac:如何使用相同的接口注册多个类型以与装饰器一起使用?

  14. 14

    _Generic与typedef结构一起使用还是仅与基本类型一起使用?

  15. 15

    在 Scala 中将类型 lambda 与更高级的类型一起使用:如何让编译器正确推断类型?

  16. 16

    Keras:如何将fit_generator与不同类型的多个输出一起使用

  17. 17

    PowerMockito-如何将whenNew()与类型列表一起使用?

  18. 18

    如何将CsvHelper.CsvWriter与F#选项类型一起使用?

  19. 19

    了解PDO /预准备语句如何与多种数据库类型一起使用

  20. 20

    如何正确一起使用size_t和其他整数类型?

  21. 21

    如何在实体框架中将过程与用户定义的表类型一起使用

  22. 22

    如何将QSort与QList中的自定义类型一起使用?

  23. 23

    如何使useRouteMatch与React-Router中的类型一起使用

  24. 24

    如何使类型类与Scala中的异构列表一起使用

  25. 25

    如何快速使基类属性通用,以便可以与多种模型类型一起使用?

  26. 26

    如何将MatSort与Object []类型的表一起使用

  27. 27

    如何将“ InsertQuery”与常规记录和表类型一起使用

  28. 28

    如何将CsvHelper.CsvWriter与F#选项类型一起使用?

  29. 29

    如何使目录变形与参数化/索引类型一起使用?

热门标签

归档