Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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_Types_Functional Programming - Fatal编程技术网

带有操纵的Haskell数据类型语法

带有操纵的Haskell数据类型语法,haskell,types,functional-programming,Haskell,Types,Functional Programming,我是一个新手,过去没有函数式编程经验(但有相当多的过程式/命令式编程经验)。我在理解如何声明自己的数据类型方面遇到了一些困难 例如,假设我声明了一个数据类型: data SomeThing = Int [Int] data SomeThing = Int [Int] 如何编写使用someData并生成someData的Haskell函数;只有生成的数据的Int是消耗数据的[Int]中所有元素的总和,其中消耗值的[Int]将生成的[Int]中的每个元素乘以2 这显然是可能的,但我在网络搜索后没

我是一个新手,过去没有函数式编程经验(但有相当多的过程式/命令式编程经验)。我在理解如何声明自己的数据类型方面遇到了一些困难

例如,假设我声明了一个数据类型:

data SomeThing = Int [Int]
data SomeThing = Int [Int]
如何编写使用someData并生成someData的Haskell函数;只有生成的数据的Int是消耗数据的[Int]中所有元素的总和,其中消耗值的[Int]将生成的[Int]中的每个元素乘以2

这显然是可能的,但我在网络搜索后没有找到任何对我有意义的答案。

(引用你的文章,因为我怀疑它会被编辑。)

例如,假设我声明了一个数据类型:

data SomeThing = Int [Int]
data SomeThing = Int [Int]
如何编写使用someData和 生成一个数据集;只有生成的数据的Int是所有数据的总和 已消费数据的[Int]中的元素,以及已消费数据的位置 值的[Int]已将生成的值中的每个元素乘以2 [Int]

我想你的意思是数据类型是

data SomeData = SomeData Int [Int]
那你想要什么

f :: SomeData -> SomeData
f (SomeData _ ys) = SomeData (sum ys) (map (2 *) ys)

首先,您的数据类型声明有一个错误。根据您的问题,您需要一个包含
Int
Int
列表的数据类型,但缺少数据构造函数1。这是模式匹配或构造数据类型的新值时使用的标签

data SomeThing = SomeThingConstr Int [Int]
当只有一个数据类型时,通常会将构造函数命名为与数据类型本身相同的名称,但为了避免混淆,我在这里为它们分别命名

现在,使用模式匹配和此数据构造函数编写函数就很容易了

foo :: SomeThing -> SomeThing
foo (SomeThingConstr _ xs) = SomeThingConstr (sum xs) (map (*2) xs)

1或者更确切地说,您有一个名为
Int
的数据构造函数,这显然不是您的意思。

@FrerichRaabe:不是编译错误,不是,但它显然不是OP想要的。@FrerichRaabe OP将输出数据称为具有单独的
Int
[Int]
字段。@dave4420:啊,是的。我误读了这个问题(哪种类型使我自己的回答无效,哎呀)。谢谢你澄清这一点。