【问题标题】:Are all types declared with newtype phantom types是否所有类型都使用 newtype 幻像类型声明
【发布时间】:2019-12-10 22:57:39
【问题描述】:

我正在学习 Haskell 中的幻像类型。我知道幻像类型是参数化类型,其参数不会出现在其定义的右侧。 但是,我想知道使用newtype 声明的所有类型是否都是幻像类型。

当我尝试使用以下代码编译程序时:

newtype SpecialInt Int = Special Int 

我收到一条错误消息:

 Unexpected type ‘Int’
    In the newtype declaration for ‘SpecialInt’
    A newtype declaration should have form
      newtype SpecialInt a = ...

如果左侧的类型参数没有出现在右侧,这让我相信新类型是幻像类型。 例如。

newtype SpecialInt a = Special a

不会是幻影类型,但是

newtype SpecialInt a = Special Int 

将是幻像类型。 因此,并非所有使用newtype 声明的类型都是幻像类型。但是,我不确定我的推理是否正确。

【问题讨论】:

  • 你可以写newtype SpecialInt = Special Int

标签: haskell types functional-programming


【解决方案1】:

如果左侧的类型参数没有出现在右侧,这让我相信新类型是幻像类型。例如

嗯,这是您引用的定义的结果。你这么说:

我知道幻像类型是参数化类型,其参数不会出现在其定义的右侧。

由于newtype 是一种定义类型的方法,并且由于对于带有未出现在右侧的参数的参数化类型是幻像类型,因此源自带有未出现类型参数的newtype 子句的类型右侧也是幻像类型。

我想知道用 newtype 声明的所有类型是否都是幻像类型。

,因为例如没有任何类型参数的newtype 或带有类型参数的newtype 类型参数在右侧使用是不是 幻象类型。

当我尝试使用以下代码编译程序时:

newtype SpecialInt Int = Special Int 

我收到一个错误 (..)

左侧的类型变量是变量Int 不是变量(它以大写字母开头),所以上面没有多大意义。如果要定义SpecialInt,则应将其定义为:

newtype SpecialInt = Special Int

所以在= 标记的左侧没有Int

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 2016-05-04
    • 2020-05-24
    • 1970-01-01
    • 2020-09-24
    相关资源
    最近更新 更多