[英]Haskell Functions (map,foldr, foldl)
我正在努力想辦法將這些函數用於這個初學者級別的編碼 class,我將在 Haskell 中學習函數式編程。我必須編寫的函數如下所示, asum
應該轉換整數列表[a1,a2,..,an]
轉換為交替和a1-a2+a3-a4+.…
我不確定如何使用這些函數來處理它。 xor
function 應該計算布爾值列表的 XOR。 我需要一些幫助來了解如何使用這些功能,我將不勝感激。 我也是 Haskell 的新手,所以任何解釋都會有所幫助。 謝謝我必須使用map foldr foldl
。
asum :: (Num a) => [a] -> a
xor :: [Bool] -> Bool
我會說首先在GHCi
中逐一運行以下命令:
:t foldr
:info foldr
:doc foldr
:t foldl
:info foldl
:doc foldl
:t map
:info map
:doc map
或者更好,打開hoogle.haskell.org並搜索上述每個功能,然后單擊第一個鏈接。
但我同意 Haskell 文檔很難閱讀,尤其是對於初學者。 我是初學者,閱讀和理解它們有很多困難。
這是一個 function,它使用map
和foldr
來展示foldr
的工作原理:
printFoldr xs = foldr (\x acc -> "(" ++ x ++ " + " ++ acc ++ " )") "0" $ map show xs
現在運行看這個:
printFoldr [1..5]
-- outputs the following:
"(1 + (2 + (3 + (4 + (5 + 0 ) ) ) ) )"
這向我們展示了如何評估foldr
。 在討論如何評估foldr
之前,讓我們簡要地看一下map
。
map show [1..5]
-- outputs the following:
["1","2","3","4","5"]
這意味着map
需要 2 個 arguments. 列表和一個應用於列表每個元素的 function。 結果是一個新列表,每個元素都應用了 function。 因此,將show
應用於每個數字會輸出它們的字符串表示形式。
返回foldr
。 foldr
需要 3 arguments:
a -> b -> b
b
的初始值[a]
類型的列表 foldr
獲取所提供列表的每個值並將此 function 應用於它。 特別之處在於 map 在每次迭代中保留 function 的 output,並在下一次運行時將其作為第二個參數傳遞給 function。 因此,將傳遞給foldr
的 function 編寫如下很方便: (\el acc -> do something)
。 現在在foldr
的下一次迭代中, acc
將保留上一次運行的值,而el
將是列表中的當前元素。 順便說一句, acc
代表累加器, el
代表元素。 這使我們能夠將提供的列表的元素減少為全新的東西。
正如您在printFoldr
中看到的,初始值只是一個空字符串,但它逐漸向其中添加列表元素,顯示它將如何將列表元素減少到它們的總和。
這是一個想法:
a1-a2+a3-a4+...
=
a1-(a2-(a3-(a4-(...(an-0)...))))
這非常適合遞歸的foldr
模式,
foldr f z [a1,a2,a3,a4,...,an]
=
a1`f`(a2`f`(a3`f`(a4`f`(...(an`f`z)...))))
所以它可以通過設置f =...
和z =...
並調用來編碼
asum :: (Num a) => [a] -> a
asum xs = foldr f z xs
where
f = (...)
z = (...)
您將需要完成此定義。
對於布爾值列表的XOR
,假設只有其中一個為True
則為True
,否則為False
,我們可以想象以下轉換序列:
[ True, False, False, True, True, False, ...]
==>
[ t, f, f, t, t, f, ...]
其中t
和f
是一些特別選擇的數字。 然后我們可以找到第二個列表的總和(不是交替總和,只是數字列表的總和)並檢查它是否等於......一些(其他?)特殊數字,我們稱之為n1
:
xor :: [Bool] -> Bool
xor bools = (aNumber ... n1)
where
list1 = bools
list2 = fun1 transform list1
transform False = f
transform True = t
f = ...
t = ...
aNumber = sum list2
n1 = ...
fun1 = ...
sum listOfNums = ...
fun1
是 function,它根據給定的 function 轉換其參數列表的每個元素,在上面稱為transform
。 考慮到我們已經在使用foldr
,它是您獲得的三個功能中剩下的兩個功能之一。
sum
將通過使用剩下的最后一個 function 來實現。
供參考,
map foo [a1,a2,a3,...,an]
=
[foo a1, foo a2, foo a3, ..., foo an]
和
foldl f z [a1,a2,a3,...,an]
=
((((z`f`a1)`f`a2)`f`a3)...)`f`an
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.