我是一名新手,过去没有任何函数式编程经验(但是,相当多的程序/命令式编程经验)。我在理解如何声明自己的数据类型方面遇到了一些麻烦。
例如,假设我声明了一种数据类型:
data SomeThing = Int [Int]
你将如何编写一个消耗someData并产生someData的Haskell函数;只有生成数据的Int是消耗数据的[Int]中所有元素的总和,并且消耗值的[Int]在生成的[Int]中每个元素乘以2。
这显然是可行的,但我没有找到任何在网络搜索后对我有意义的答案。
答案 0 :(得分:6)
首先,您的数据类型声明中存在错误。根据您的问题,您需要的数据类型包含Int
和Int
列表,但您缺少数据构造函数 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)