2014-04-14 152 views
1

我對haskell上的遞歸函數有點困惑,有人能更好地解釋我嗎?列表的遞歸函數

cut [] = ([],[]) 
cut (x:[]) = ([x],[]) 
cut (x:y:l) = let (xs,ys) = cut l 
      in (x:xs,y:ys) 

P.S. :「讓...進來」部分讓我很困惑!

+0

比什麼好? –

回答

1

哈斯克爾let的語法如下:let <bindings> in <expression>

所以你創建一些綁定和使用,在表達。

實施例:

λ> let a = 3 in a + 3 
6 

類型cut功能是cut :: [a] -> ([a], [a])

所以,函數cut返回一個([a],[a])類型的元組,這正是您的cut函數的let表達式中匹配的模式。變量xs與元組的第一個元素即[a]模式匹配,並且下一個變量ys與另一個列表的元組的第二個元素模式匹配。

+0

哦,我想我可能會明白!所以遞歸是在...之間進行的,對吧? – Damiii

+0

@Damiii是的,因爲那是調用'cut'函數的地方。 – Sibi

1
cut [] = ([],[]) 
cut (x:[]) = ([x],[]) 

這些邊緣的條件下,和

cut (x:y:l) = let (xs,ys) = cut l 
       in (x:xs,y:ys) 

是遞歸部分。在這裏面,

  1. 模式匹配(x:y:l)將打破cut三個部分的自變量列表,它第一個元素將被綁定到x,第二元件y,其餘到l

  2. let (xs, ys) = cut l說施加cutl,結果應該是一對,並且它的第一部分結合至xs,第二部分以ys

  3. 在這種情況下,cut (x:y:l)的值將爲(x:xs,y:ys)

1

我會通過一步一步的示例,希望它會使事情更清晰。首先讓我建立以下行號:

1. cut [] = ([],[]) 
2. cut (x:[]) = ([x],[]) 
3. cut (x:y:l) = let (xs,ys) = cut l 
        in (x:xs,y:ys) 

使用下面的呼叫爲例:

cut [0,1,2] 

這行3的條款相符,因爲該名單至少有2個元素。因此,x = 0y = 1l = [2]。因此,它的計算結果爲以下內容:

let (xs,ys) = cut [2] 
       in (0:xs, 1:ys) 

cut [2]線2的與x該條被綁定到2相匹配。

let (xs,ys) = ([2], []) 
      in (0:xs, 1:ys) 

然後,我們得出結論:xs = [2]ys = []

(0:[2], 1:[]) 

這是一樣的:

([0,2], [1]) 

那麼這個函數是在做二是分裂的列表,通過把第一個列表中的偶數索引和第二個列表中的奇數索引。

+0

謝謝! 我明白了一切! :) – Damiii

+1

@Damiii不客氣:) –