我想要一個高階函式 g,它將另一個函式 f 應用于整數串列,使得g = [fx1, f(f x2), f(f(f x3)), ... , f^n (xn)]
我知道我可以映射一個函式
g :: (Int -> Int) -> [Int] -> [Int]
g f xs = map f xs
我也可以應用一個函式 n 次,比如
g f xs = [iterate f x !! n | x <- xs]
其中 n 是應用函式的次數。我知道我需要使用遞回,所以我認為這些選項中的任何一個都沒有用。
預期輸出:
g ( 1) [1,2,3,4,5] = [2,4,6,8,10]
uj5u.com熱心網友回復:
您可以使用顯式遞回,每次傳遞要應用的函式和串列的尾部,因此:
g :: (Int -> Int) -> [Int] -> [Int]
g f = go f
where go _ [] = []
go fi (x:xs) = … : go (f . fi) xs
我在這里將實作該…部分作為練習。
另一種選擇是使用兩個串列,一個函式串列和一個值串列。在這種情況下,函式串列是iterate (f .) f:可以應用的無限函式串列。然后我們可以實作g為:
g :: (Int -> Int) -> [Int] -> [Int]
g f = zipWith ($) (iterate (f .) f)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/329929.html
上一篇:c#遞回查找最大值(最快)
