2015-12-09 72 views
2

我試圖寫一個Haskell函數,接受兩個一元函數(f和g)和數字(納秒)的列表,並且可選地應用於這些輸入函數f和g,以的元素輸入的列表。Haskell的功能

例如:

func double square [2, 3, 4, 5, 6] 

[4, 9, 8, 25, 12] 

我使用WinGHCi我的編譯器返回。任何幫助編寫這個函數,將不勝感激,謝謝。

+4

退房'zipWith'和'cycle'。 – luqui

+0

見http://stackoverflow.com/questions/17383169/haskell-double-every-2nd-element-in-list/17383354#17383354 –

+1

我試圖不使用庫函數,我怎麼沒看到zipWith將有助於... –

回答

6

如果你不想使用任何庫函數,你可以通過使用遞歸做到這一點:

func _ _ []  = [] 
func f g (x:xs) = f x : func g f xs 
+0

作爲一行程序:'INTERMAP F G XS = foldr相似(\ X讀F G - >˚FX:R G F)(\ _ _ - > [])XS˚Fg'。 – user3237465

-2

只是一個簡單的解決方案...

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。這個想法很簡單,就是使用一個計數器來知道哪個位置是平坦的。

編輯:我做了我的累加器有點混亂。現在,這是正確的。

+0

請重新考慮你的投票。 –

+1

目標是爲了避免圖書館功能,原因不明。 –

1

擴大對@ luqui的評論:

func f1 f2 l = zipWith ($) (cycle [f1, f2]) l 

如果你不想使用的庫函數,就看他們的實現,他們是很簡單的。