2017-02-06 65 views
1

我學習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))是什麼意思?

+0

您可以將函數重寫爲'h s = zipWith(<=)s(tail s)',這可能會使讀起來更容易。 – Taren

+0

@Taren:不完全是因爲原來的'h'會爲空列表返回'[]',而你的定義會崩潰。但我承認這是一個細節:)。 –

+0

@WillemVanOnsem其實,如果s是空的(tail s)永遠不會被評估,並且它工作正常!所有人都渴望懶惰或什麼。 – Taren

回答

4

第三個條件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]

4

h的全部類型是Ord a => [a] -> [Bool]

  1. 前兩個方程式暗示輸入和輸出都是某種類型的列表。對於我們的第一遍,我們將假設h :: [a] -> [b];我們將找出接下來ab屬於哪些限制(如果有的話)。

  2. 第三個公式中輸入列表中的前兩個值由(<=) :: Ord a => a -> a -> Bool使用,所以我們現在知道輸入列表必須是Ord a => [a]

  3. 此外,(<=)的結果被預置爲遞歸調用返回值h。爲了工作,自(:) :: a -> [a] -> [a]以來,我們知道h必須返回[Bool]類型的值。