Reputation: 187
I am trying to write a Haskell function that takes two unary functions (f and g) and a list of numbers (ns) and alternatively applies those input functions f and g to the elements of the inputted list.
For example:
func double square [2, 3, 4, 5, 6]
would return
[4, 9, 8, 25, 12]
I am using WinGHCi for my compiler. Any help on writing this function would be appreciated, thanks.
Upvotes: 2
Views: 292
Reputation: 3218
Just a simple solution...
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)
Since you do not want to use library functions, you can reproduce the same result without using foldl
. The idea is simple to use a counter to know which position is even or not.
Edit: I've made a little confusion on my accumulator. Now, it is correct.
Upvotes: -2
Reputation: 384
If you don't want to use any library functions, you can do this by using recursion:
func _ _ [] = []
func f g (x:xs) = f x : func g f xs
Upvotes: 6
Reputation: 9726
Expanding on @luqui's comment:
func f1 f2 l = zipWith ($) (cycle [f1, f2]) l
If you don't want to use library functions, just look up their implementations, they're quite simple.
Upvotes: 2