Haskell 交替应用输入一元函数的函数
Haskell function that alternatively applies input unary functions
我正在尝试编写一个 Haskell 函数,该函数接受两个一元函数(f 和 g)和一个数字列表 (ns),然后将这些输入函数 f 和 g 应用到输入的元素列表。
例如:
func double square [2, 3, 4, 5, 6]
会return
[4, 9, 8, 25, 12]
我正在为我的编译器使用 WinGHCi。任何有关编写此函数的帮助将不胜感激,谢谢。
只是一个简单的解决方案...
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
如果不想用库函数,就看他们的实现,很简单。
如果你不想使用任何库函数,你可以使用递归来实现:
func _ _ [] = []
func f g (x:xs) = f x : func g f xs
我正在尝试编写一个 Haskell 函数,该函数接受两个一元函数(f 和 g)和一个数字列表 (ns),然后将这些输入函数 f 和 g 应用到输入的元素列表。
例如:
func double square [2, 3, 4, 5, 6]
会return
[4, 9, 8, 25, 12]
我正在为我的编译器使用 WinGHCi。任何有关编写此函数的帮助将不胜感激,谢谢。
只是一个简单的解决方案...
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
如果不想用库函数,就看他们的实现,很简单。
如果你不想使用任何库函数,你可以使用递归来实现:
func _ _ [] = []
func f g (x:xs) = f x : func g f xs