计算每个子列表的元素

时间:2015-05-29 21:00:21

标签: haskell

所以我正在使用这个功能来计算每个子列表的长度。它采用包含子列表的列表并返回一个新列表,每个元素指定每个子列表的大小。

类似的东西:

*Main> count [[], ["this", "is"], ["a", "test", "!!!"]]

应该返回

[0,2,3]

这是我到目前为止所做的,但它只打印整个列表中每个子列表的总大小

[5]

代码:

count :: [[a]] -> [Int]
count [] = []
count (x:xs) =  [1 + myLength (x:xs)]

顺便说一下myLength是我写的用来计算大小的一个简单函数。

3 个答案:

答案 0 :(得分:4)

Prelude已定义lengthmap。因此,您的计数可以定义为:

count = map length 

答案 1 :(得分:1)

请注意,您的输入列表是列表列表,因此您必须执行此操作:

count :: [[a]] -> [Int]
count [] = []
count (x:xs) =  (myLength x):(count xs)

您需要使用myLength函数计算长度,并为列表的每个元素计算长度,并使用:函数进行构建。 xs将是列表的其余部分,您必须再次将其传递给count以进行计算。

答案 2 :(得分:0)

Eugene Sh 提供了上面最好(最简单)的答案:只需在输入中使用map length

但听起来这个问题是家庭作业,其目的是展示对递归的基本理解。所以我们真的不应该帮助你:)但我会尝试以一种不仅仅是答案的方式来解释。

使用任何递归定义,您必须首先定义基本案例。由于您正在处理列表列表,因此最简单的情况是包含无子列表的列表 - 其模式类似于[]

您还必须定义递归情况(有时也称为归纳情况),其中等式的右侧将包含对正在定义的功能。

因此,您对名为len的子列表长度函数的两个必要定义:

len (xs:xss) = length xs : len xss
len _        = []

我们的第一行定义了递归案例;注意它的右侧包含对我们定义的函数的引用(在本例中为len)。我们使用xs的流行Haskell约定作为任意内容类型的列表,并使用xss作为列表列表。整体模式(xs:xss)匹配任何带有列表(xs)的输入,后跟任意数量的其他列表(xss) - 请注意,这可能意味着进一步列表!在这种情况下,模式具体为xs:[]

对于第二行,我们没有给出明确的模式 - 我们使用通配符模式 _。这向Haskell(以及其他程序员)传达了这样一个事实,即我们希望为任何输入返回[],而不是上面一行匹配的输入。因此,当我们的递归最终到达列表的末尾时,它会遇到类似[]的模式 - 单个列表,而不是任何其他列表。这是我们的基本情况,我们定义了结束递归的最终输出。