所以我正在使用这个功能来计算每个子列表的长度。它采用包含子列表的列表并返回一个新列表,每个元素指定每个子列表的大小。
类似的东西:
*Main> count [[], ["this", "is"], ["a", "test", "!!!"]]
应该返回
[0,2,3]
这是我到目前为止所做的,但它只打印整个列表中每个子列表的总大小
[5]
代码:
count :: [[a]] -> [Int]
count [] = []
count (x:xs) = [1 + myLength (x:xs)]
顺便说一下myLength是我写的用来计算大小的一个简单函数。
答案 0 :(得分:4)
Prelude已定义length
和map
。因此,您的计数可以定义为:
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(以及其他程序员)传达了这样一个事实,即我们希望为任何输入返回[]
,而不是上面一行匹配的输入。因此,当我们的递归最终到达列表的末尾时,它会遇到类似[]
的模式 - 单个列表,而不是任何其他列表。这是我们的基本情况,我们定义了结束递归的最终输出。