T-Bird
T-Bird

Reputation: 187

Haskell function that alternatively applies input unary functions

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

Answers (3)

Rodrigo Ribeiro
Rodrigo Ribeiro

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

Michael Szvetits
Michael Szvetits

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

fjarri
fjarri

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

Related Questions