[英]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.