Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中定义数据结构/类型_Haskell_Data Structures_Types - Fatal编程技术网

在Haskell中定义数据结构/类型

在Haskell中定义数据结构/类型,haskell,data-structures,types,Haskell,Data Structures,Types,如何在Haskell中定义一个数据结构,这样就有了适用于结构元素的某些约束/规则,并且能够在类型中反映这一点 例如,如果我有一个由另一个类型的列表组成的类型,比如 r=[x | x在sodoku示例中,创建一个具有多个构造函数的数据类型,每个构造函数表示一个“规则”或语义属性。 即 现在在一些验证函数中,您将返回一个InvalidRow,其中检测到sodoku规则的验证,以及一个ValidRow,其中检测到成功的行(或列或正方形等)。这也允许您进行模式匹配 您遇到的问题是,您没有使用类型,而是使

如何在Haskell中定义一个数据结构,这样就有了适用于结构元素的某些约束/规则,并且能够在类型中反映这一点

例如,如果我有一个由另一个类型的列表组成的类型,比如


r=[x | x在sodoku示例中,创建一个具有多个构造函数的数据类型,每个构造函数表示一个“规则”或语义属性。 即

现在在一些验证函数中,您将返回一个
InvalidRow
,其中检测到sodoku规则的验证,以及一个
ValidRow
,其中检测到成功的行(或列或正方形等)。这也允许您进行模式匹配

您遇到的问题是,您没有使用类型,而是使用值。您正在定义一个值列表,而该列表没有说明它包含的值


请注意,我使用的示例可能不是很有用,因为它不包含任何关于行位置或类似信息,但您可以自己定义它。

在sodoku示例中,创建一个具有多个构造函数的数据类型,每个构造函数表示一个“规则”或语义属性。 即

现在在一些验证函数中,您将返回一个
InvalidRow
,其中检测到sodoku规则的验证,以及一个
ValidRow
,其中检测到成功的行(或列或正方形等)。这也允许您进行模式匹配

您遇到的问题是,您没有使用类型,而是使用值。您正在定义一个值列表,而该列表没有说明它包含的值


请注意,我使用的示例可能不是很有用,因为它不包含任何关于行位置或类似信息,但您可以自己定义它。

在某些情况下,GADT可以提供帮助。依赖类型可以做任何事情,但Haskell不支持它们(它们需要程序员付出不平凡的努力)。“需要不平凡的努力”-获得正确的程序所需的努力是恒定的。选择是努力体现在哪里:在您声明的类型中,在您编写的实现中,或者只是在您的头脑中。当然,最后一个变量是最不可重用的。在某些情况下,GADT可以提供帮助。依赖类型可以做所有事情,但Haskell不支持它们(它们需要程序员付出不平凡的努力)。“需要不平凡的努力”-获得正确的程序所需的努力是恒定的。选择是努力体现在哪里:在您声明的类型中,在您编写的实现中,或者在您的头脑中。当然,最后一个变体是最不可重用的。
data SodokuType = NotValidatedRow | InvalidRow | ValidRow