簡體   English   中英

Haskell 函數(地圖、文件夾、文件夾)

[英]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,它使用mapfoldr來展示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:

  1. a function 類型a -> b -> b
  2. 類型b的初始值
  3. [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,     ...]

其中tf是一些特別選擇的數字。 然后我們可以找到第二個列表的總和(不是交替總和,只是數字列表的總和)並檢查它是否等於......一些(其他?)特殊數字,我們稱之為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM