簡體   English   中英

Haskell中的Foldr和Foldl函數

[英]Foldr and Foldl function in haskell

Haskell編程中有折疊功能的代碼。

map' ::(a->b)->[a]->[b]
map' f xs=foldr(\x acc ->f x:acc)[] xs

INPUT:

map' (+3) [1,2,3]

OUTPUT:

[4,5,6]

由於使用了foldr函數,它從右側獲取了元素,我想從左側獲取該元素並追加到列表中,並且我想要一個輸出[6,5,4]。我通過foldl函數完成了它,但是它給出了錯誤。

ERROR: Couldn't match expected type `a' with actual type `[b]'
      `a' is a rigid type variable bound by
          the type signature for map' :: (a -> b) -> [a] -> [b]
          at doubleme.hs:1:8
    In the first argument of `f', namely `x'
    In the first argument of `(:)', namely `f x'
    In the expression: f x : acc

將您的函數簽名更改為map' ::(a->b)->[a]->[b]

map操作基本上采用一個函數,該函數將類型為“ a”的元素轉換為類型為“ b”的元素,並將其列表轉換為類型“ a”的元素,以使用轉換生成類型為“ b”的元素列表功能。 您的函數簽名包含另一種類型'c'與此相反,因為'b'和'c'不能隱式地假定為同一類型。

接下來,要使用foldl ,您必須反轉輸入參數的順序,如下所示:

map' :: (a->b)->[a]->[b]
map' f xs = foldl (\acc x ->f x:acc) [] xs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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