2015-05-29 113 views
0

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

喜欢的东西:

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

应该返回

[0,2,3] 

这里是我到目前为止,但它只能打印整个列表的每个子列表是

总规模
[5] 

代码:

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

btw myLength是我写的计算大小的微不足道的函数。

回答

1

请注意,您的输入列表是列表的列表,所以你必须要做到这一点:

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

你需要使用myLength函数来计算长度和列表中的每个元素,并使用:建立起来功能。 xs将成为列表的其余部分,您必须再次将它传递给count才能计算出来。

5

有Prelude定义为lengthmap。所以,你的计数可以被定义为简单:

count = map length 
0

尤金嘘上面提供最好的(简单的)答案:刚刚您输入使用map length

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

使用任何递归定义,您必须先定义您的基本情况。由于您正在处理列表,您最简单的情况是包含无列表的列表 - 其模式看起来像[]

还必须定义一个递归情况下(有时也被称为感应情况),其中该方程的右手侧将包含被限定到非常函数的引用。

因此,对于一个子列表长度函数的两个必要的定义称为len

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

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

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

相关问题