【问题标题】:Invalid data type无效的数据类型
【发布时间】:2018-05-09 08:29:45
【问题描述】:

以下代码无效:

data A = Int | [Int] | (Int, Int)

为什么可以使用具体类型 Int 作为数据类型定义的一部分,但不能使用具体类型 [Int](Int, Int)

【问题讨论】:

  • 它不使用第一个类型作为Int,它在这里看到Int作为构造函数。
  • Haskell 的工会是tagged

标签: haskell types algebraic-data-types


【解决方案1】:

为什么可以使用具体类型 Int 作为数据类型定义的一部分 (..)

不行

您在这里编写的是数据类型A 的定义,该数据类型有一个名为Int构造函数。这与Int的数据类型无关,构造函数的名称与类型的名称相同只是一个巧合,但这对于Haskell编译器来说不是问题,因为Haskell有一个明确的类型和构造函数名称的区别。

但是,您不能使用[Int],因为[Int] 不是标识符(它以左方括号开头),也不是运算符(只能使用符号)。所以 Haskell 并不真正知道如何处理这个和这个输入上的错误。

如果您想定义一个可以采用Int 值的数据类型,您需要将其添加为参数。您还可以为 [Int](Int, Int) 参数定义构造函数。例如:

data A = <b>Int</b> Int | <b>Ints</b> [Int] | <b>Int2</b> (Int,Int)

所以这里有三个构造函数:IntIntsInt2。第一个构造函数以Int 作为参数,第二个以[Int] 作为参数,最后一个以(Int, Int) 作为参数。

话虽如此,这可能会导致很多混乱,因此最好使用不会引起混乱的构造函数名称,例如:

data A = <b>A</b> Int | <b>As</b> [Int] | <b>A2</b> (Int,Int)

注意data AA可以用在函数的签名中,而构造函数(粗体)用作值(所以在函数的实现中,也就是在子句的头部,并且为了在子句的主体中构造一个值)。

【讨论】:

  • 这可能有助于指出粗体大写的东西只存在于术语级别(在代码中),而其他大写的东西只出现在类型级别(在类型签名中)。我认为语法在这方面可能会令人困惑。
  • A1 Int 会引起更少的混乱。
猜你喜欢
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
相关资源
最近更新 更多