簡體   English   中英

使用高階函數而不是顯式遞歸

[英]Use higher-order functions instead of explicit recursion

我想編寫一個 function f將二進制列表轉換為 integer,例如:

f :: [Integer] -> Integer
f [] = 0
f list = (last list) * 2^(length list -1) + f (init list)

例如,在f [1,1,1,1,0,0,1,0] = 79中,第一個列表元素表示 2^0,最后一個列表元素表示 2^7。

我可以用高階函數而不是顯式遞歸來編寫這個 function 嗎?

看來你的列表順序對 foldl 來說是不幸的,但你可以像這樣傳遞指數:

intvalueOfList = fst . foldl f (0,1) 
   where f (acc,exp) e = (acc+e*exp, exp*2)

您可以使用foldr:: Foldable f => (a -> b -> b) -> b -> fa -> b ,它使用帶有元素和累加器的“折疊” function。 累加器在概念上在列表上從右到左運行。 因此,您可以每次對累加器進行 souble,然后添加元素的值:

f :: (Foldable f, Num a) => f a -> a
f = foldr g 0
    where g x acc = …

你仍然需要填寫g的地方。

暫無
暫無

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

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