2017-07-19 72 views
0

所以我得將返回True功能,如果數量n應用的按位或XS的任何序列結果:FOLDR適用於只是一個參數

checkBits xs n = not $ null $ filter (==n) $ map (foldr (.|.) zeroBits) (subsequences xs)

現在事情我沒有得到的是foldr給出(.|.)zeroBits,但我沒有需要foldr另一個參數。 就像我理解的foldr功能,您將它應用到的功能,這是在這種情況下(.|.),在「初始值」,這是我的猜測是zeroBits,但什麼t a,這是中提到:

Prelude>:t foldr foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b

有什麼我失蹤了嗎?以上代碼的工作原理應該如此。

+3

Haskell不要求您一次提供所有參數。如果你只提供前兩個,你就是部分應用這個函數,而結果是另一個需要最後兩個函數的函數。這是Haskell的一個普遍特性,不僅限於'foldr'。 –

+3

嘗試詢問GHCI有關'foldr(。|。)zeroBits'的類型:因爲它顯然是一個有效的表達式,它必須有一些類型,對吧?你認爲這種類型意味着什麼?它是如何得到這種類型的? – amalloy

+0

哦,我不知道。聽起來像一個很酷的功能!謝謝,我懂了! – IPiiro

回答

1

foldr帶有「missing」參數返回一個函數,該函數接受一個參數(缺少的參數)。

然後,您可以繼續執行map,該功能通過您的subsequences xs(這意味着每個子序列都作爲「缺失」參數傳遞給您的專用foldr函數)。

這是一個非常常見且有用的模式,它允許您通過將參數的子集固定到更一般的函數來創建專門的功能。


在您的示例中,「專業功能」保持匿名狀態。如果這太難以閱讀(或者該函數在很多地方很有用),那麼可以給它一個名字。

-- create a new function that takes the first ten list elements 
top10 = take 10  -- call take with a "missing parameter" 

-- as opposed to 
ten = take 10 myList -- call take with all parameters to get a list 

它可以幫助(或混淆)想Haskell函數僅採用單個參數,並返回一個函數,它的下一個參數(這反過來會返回一個函數,它的第三個參數或如果這是最後一個結果,則是一個簡單的結果)。然後可以將take 1 list這樣的表達式讀取爲(take 1) list:調用take 1以獲取函數,然後在list上調用該函數以獲得最終結果。