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

时间:2011-10-20 07:17:56

标签: haskell types functional-programming

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

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

data SomeThing = Int [Int]

你将如何编写一个消耗someData并产生someData的Haskell函数;只有生成数据的Int是消耗数据的[Int]中所有元素的总和,并且消耗值的[Int]在生成的[Int]中每个元素乘以2。

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

2 个答案:

答案 0 :(得分:6)

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

data SomeThing = SomeThingConstr Int [Int]

当只有一个时,将构造函数命名为与数据类型本身相同的东西是很常见的,但我在这里给它们单独的名称以避免混淆。

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

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

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

答案 1 :(得分:1)

(因为我怀疑它会被编辑,所以从您的帖子中引用。)

  

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

data SomeThing = Int [Int]
     

你如何编写一个消耗someData和的Haskell函数?   产生一些someData;只有生成的数据的Int是所有数据的总和   消费数据中的元素[Int],以及消耗的数据   value [的] [Int]已经生成了每个元素乘以2   [INT]。

我认为你的意思是数据类型

data SomeData = SomeData Int [Int]

然后你想要

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