2015-12-09 74 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 

如果你不想使用的库函数,就看他们的实现,他们是很简单的。