gpt4 book ai didi

haskell - 无法解析数据/新类型声明中的数据构造函数 : [Either Int Int]

转载 作者:行者123 更新时间:2023-12-02 13:02:23 24 4
gpt4 key购买 nike

我正在尝试声明一个数据类型,它是Either 类型的列表。

data EitherInts = [Either Int Int]

但是当我尝试编译此类型时,出现错误:

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

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

最佳答案

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

data EitherInts = EitherInts [Either Int Int]

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

type EitherIntsType = [Either Int Int]

newtype EitherIntsNewtype = EitherInts [Either Int Int]

第一个使用 type,其作用与 [Either Int Int] 完全相同:诸如 [Left 2] 之类的值是有效的新 EitherIntsType 类型的值。它只是现有类型的新缩写名称,并且可以与其互换使用。当您只想为现有类型使用不同的名称时,这种方法就很好:为了清晰起见,或者为较长的类型提供较短的名称。

第二个使用newtype,重量级更大。它的行为更像data,有自己的构造函数。像 [Left 2] 这样的值不是EitherIntsNewtype 类型的有效值。相反,您必须编写 EitherintsNewtype [Left 2] 来提升现有列表值,并且必须进行模式匹配来提取值。当您需要编译器的帮助以确保不会混淆提升值和未提升值时,或者当您想要类似现有类型但具有不同类型类实例的东西时(因为您可以为您的 newtype 它自己的类型类实例,类型 不能拥有)。

关于haskell - 无法解析数据/新类型声明中的数据构造函数 : [Either Int Int],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35823465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com