我對haskell上的遞歸函數有點困惑,有人能更好地解釋我嗎?列表的遞歸函數
cut [] = ([],[])
cut (x:[]) = ([x],[])
cut (x:y:l) = let (xs,ys) = cut l
in (x:xs,y:ys)
P.S. :「讓...進來」部分讓我很困惑!
我對haskell上的遞歸函數有點困惑,有人能更好地解釋我嗎?列表的遞歸函數
cut [] = ([],[])
cut (x:[]) = ([x],[])
cut (x:y:l) = let (xs,ys) = cut l
in (x:xs,y:ys)
P.S. :「讓...進來」部分讓我很困惑!
哈斯克爾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
與另一個列表的元組的第二個元素模式匹配。
cut [] = ([],[])
cut (x:[]) = ([x],[])
這些邊緣的條件下,和
cut (x:y:l) = let (xs,ys) = cut l
in (x:xs,y:ys)
是遞歸部分。在這裏面,
模式匹配(x:y:l)
將打破cut
三個部分的自變量列表,它第一個元素將被綁定到x
,第二元件y
,其餘到l
let (xs, ys) = cut l
說施加cut
到l
,結果應該是一對,並且它的第一部分結合至xs
,第二部分以ys
在這種情況下,cut (x:y:l)
的值將爲(x:xs,y:ys)
。
我會通過一步一步的示例,希望它會使事情更清晰。首先讓我建立以下行號:
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 = 0
,y = 1
和l = [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])
那麼這個函數是在做二是分裂的列表,通過把第一個列表中的偶數索引和第二個列表中的奇數索引。
謝謝! 我明白了一切! :) – Damiii
@Damiii不客氣:) –
比什麼好? –