2015-05-29 148 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(和其他程序員)傳達了以下事實:我們希望[]返回任何輸入,而不是以上行匹配的輸入。因此,當我們的遞歸最終到達列表的末尾時,它會遇到像[]這樣的模式 - 一個列表,其後沒有任何其他列表。這是我們的基本案例,其中我們定義結束遞歸的最終輸出。

相關問題