我試圖寫一個Haskell函數,接受兩個一元函數(f和g)和數字(納秒)的列表,並且可選地應用於這些輸入函數f和g,以的元素輸入的列表。Haskell的功能
例如:
func double square [2, 3, 4, 5, 6]
將
[4, 9, 8, 25, 12]
我使用WinGHCi我的編譯器返回。任何幫助編寫這個函數,將不勝感激,謝謝。
我試圖寫一個Haskell函數,接受兩個一元函數(f和g)和數字(納秒)的列表,並且可選地應用於這些輸入函數f和g,以的元素輸入的列表。Haskell的功能
例如:
func double square [2, 3, 4, 5, 6]
將
[4, 9, 8, 25, 12]
我使用WinGHCi我的編譯器返回。任何幫助編寫這個函數,將不勝感激,謝謝。
如果你不想使用任何庫函數,你可以通過使用遞歸做到這一點:
func _ _ [] = []
func f g (x:xs) = f x : func g f xs
作爲一行程序:'INTERMAP F G XS = foldr相似(\ X讀F G - >˚FX:R G F)(\ _ _ - > [])XS˚Fg'。 – user3237465
只是一個簡單的解決方案...
fun :: (a -> b) -> (a -> b) -> [a] -> [b]
fun f g = reverse . snd . foldl step (0,[])
where
step (c,ac) x = (c + 1, (if even c then f x else g x) : ac)
既然你不想使用的庫函數,可以重現相同的結果,而無需使用foldl
。這個想法很簡單,就是使用一個計數器來知道哪個位置是平坦的。
編輯:我做了我的累加器有點混亂。現在,這是正確的。
請重新考慮你的投票。 –
目標是爲了避免圖書館功能,原因不明。 –
擴大對@ luqui的評論:
func f1 f2 l = zipWith ($) (cycle [f1, f2]) l
如果你不想使用的庫函數,就看他們的實現,他們是很簡單的。
退房'zipWith'和'cycle'。 – luqui
見http://stackoverflow.com/questions/17383169/haskell-double-every-2nd-element-in-list/17383354#17383354 –
我試圖不使用庫函數,我怎麼沒看到zipWith將有助於... –