2

我正在尝试编写一个 Haskell 函数,它采用两个一元函数(f 和 g)和一个数字列表(ns),或者将这些输入函数 f 和 g 应用于输入列表的元素。

例如:

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

会回来

[4, 9, 8, 25, 12]

我正在为我的编译器使用 WinGHCi。任何有关编写此函数的帮助将不胜感激,谢谢。

4

3 回答 3

6

如果你不想使用任何库函数,你可以使用递归来做到这一点:

func _ _ []     = []
func f g (x:xs) = f x : func g f xs
于 2015-12-09T01:29:06.150 回答
2

扩展@luqui 的评论:

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

如果您不想使用库函数,只需查找它们的实现,它们非常简单。

于 2015-12-09T00:47:30.923 回答
-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. 这个想法很简单,可以使用计数器来知道哪个位置是偶数或非偶数。

编辑:我对我的累加器有点困惑。现在,它是正确的。

于 2015-12-09T00:27:09.820 回答