代码之家  ›  专栏  ›  技术社区  ›  dopatraman

haskell-无法分析data/newtype声明中的数据构造函数:[Ether Int Int]

  •  6
  • dopatraman  · 技术社区  · 10 年前

    我试图声明一个数据类型,它是 Either 类型。

    data EitherInts = [Either Int Int]
    

    但是当我尝试编译这个类型时,我会得到一个错误:

    Cannot parse data constructor in a data/newtype declaration: [Either Int Int]
    

    我不知道为什么。我做错了什么?

    1 回复  |  直到 10 年前
        1
  •  13
  •   amalloy    3 年前

    data 用于定义新的代数数据类型,每个数据类型必须有自己的构造函数。所以你可以写

    data EitherInts = EitherInts [Either Int Int]
    

    但你可能不是这个意思:你想要某种类型的同义词。有两种可能性:

    type EitherIntsType = [Either Int Int]
    

    newtype EitherIntsNewtype = EitherInts [Either Int Int]
    

    第一种,使用 type ,行为与 [Either Int Int] :一个值,如 [Left 2] 是new的有效值 EitherIntsType 类型它只是现有类型的一个新的缩写名称,可以与之互换使用。当您只想为现有类型使用不同的名称时,这种方法很好:为了清晰起见,或者为更长的类型指定更短的名称。

    第二,使用 newtype ,重量更重。它的行为更像 数据 ,具有自己的构造函数。价值观如 [左2] 新的有效值 EitherIntsNewtype 类型相反,你必须写 EitherintsNewtype [Left 2] 要提升现有列表值,必须使用模式匹配来提取值。当您需要编译器的帮助以确保不会混淆提升值和未提升值时,或者当您需要类似于现有类型但具有不同类型类实例的东西时(因为您可以为 新类型 它自己的typeclass实例 类型 不能有)。

    推荐文章