带有操纵的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:啊,是的。我误读了这个问题(哪种类型使我自己的回答无效,哎呀)。谢谢你澄清这一点。