我學習Haskell和看到了這個問題:列出在函數式編程,更具體在Haskell
h [] = []
h [x] = []
h (x:y:ys) = (x <= y): (h (y:ys))
的問題是,(1)什麼是h
輸出類型? (2)如果xs
的長度是100那麼什麼是h xs
的長度? (3)計算h [1..5]
和(4)h [1,2,1,2,1]
我不明白如何進行此操作。第三個條件h (x:y:ys) = (x <= y): (h (y:ys))
是什麼意思?
我學習Haskell和看到了這個問題:列出在函數式編程,更具體在Haskell
h [] = []
h [x] = []
h (x:y:ys) = (x <= y): (h (y:ys))
的問題是,(1)什麼是h
輸出類型? (2)如果xs
的長度是100那麼什麼是h xs
的長度? (3)計算h [1..5]
和(4)h [1,2,1,2,1]
我不明白如何進行此操作。第三個條件h (x:y:ys) = (x <= y): (h (y:ys))
是什麼意思?
第三個條件
h (x:y:ys) = (x <= y): (h (y:ys))
究竟意味着什麼?
那麼這是短期的:
h (x:(y:ys)) = (x <= y): (h (y:ys))
那麼它匹配給定的列表中包含至少兩個元素。在這種情況下,它將第一個元素與第二個元素x <= y
進行比較,如果結果爲Bool
則放在結果列表的頭部。接下來,使用第二個元素和其餘元素對h
進行遞歸調用。
那麼函數計算什麼? (1)對於給定的列表n元素,它返回一個列表n-1布爾值表示對於每兩個連續數字,列表是否(不嚴格)增加。所以要回答你第一個問題。
此外爲Ñ元件給定的清單時,它返回的n-1個元素的列表,因此,如果你給它的100個元素的列表,它(2)返回99個元素的列表。
最後的h [1..5]
這意味着我們將得到(3)[True,True,True,True]
和h [1,2,1,2,1]
我們將得到(4)[True,False,True,False]
。
h
的全部類型是Ord a => [a] -> [Bool]
。
前兩個方程式暗示輸入和輸出都是某種類型的列表。對於我們的第一遍,我們將假設h :: [a] -> [b]
;我們將找出接下來a
和b
屬於哪些限制(如果有的話)。
第三個公式中輸入列表中的前兩個值由(<=) :: Ord a => a -> a -> Bool
使用,所以我們現在知道輸入列表必須是Ord a => [a]
。
此外,(<=)
的結果被預置爲遞歸調用返回值h
。爲了工作,自(:) :: a -> [a] -> [a]
以來,我們知道h
必須返回[Bool]
類型的值。
您可以將函數重寫爲'h s = zipWith(<=)s(tail s)',這可能會使讀起來更容易。 – Taren
@Taren:不完全是因爲原來的'h'會爲空列表返回'[]',而你的定義會崩潰。但我承認這是一個細節:)。 –
@WillemVanOnsem其實,如果s是空的(tail s)永遠不會被評估,並且它工作正常!所有人都渴望懶惰或什麼。 – Taren