我试图写一个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将有助于... –