List Haskell函数,可交替应用输入一元函数
我试图编写一个Haskell函数,它接受两个一元函数(f和g)和一个数字列表(ns),或者将这些输入函数f和g应用于输入列表的元素 例如:List Haskell函数,可交替应用输入一元函数,list,function,haskell,input,winghci,List,Function,Haskell,Input,Winghci,我试图编写一个Haskell函数,它接受两个一元函数(f和g)和一个数字列表(ns),或者将这些输入函数f和g应用于输入列表的元素 例如: func double square [2, 3, 4, 5, 6] 会回来吗 [4, 9, 8, 25, 12] 我正在为我的编译器使用WinGHCi。如果您对编写此函数有任何帮助,我们将不胜感激。这只是一个简单的解决方案 fun :: (a -> b) -> (a -> b) -> [a] -> [b] fun f g
func double square [2, 3, 4, 5, 6]
会回来吗
[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
查看
zipWith
和cycle
。我正在尝试不使用库函数,我不知道zipWith会有什么帮助……为什么不使用库函数?@t-Bird:避免使用库函数不是一个好主意。好的函数式编程风格包括将问题分解成更小的部分,并使用标准库中的通用、可重用函数来解决这些问题。因此,最好的策略是(a)使用标准库函数来解决问题,然后(b)编写自己的函数版本作为附加练习。这是一个递归解决方案,因为您可以在步骤(b)中使用其他库函数作为一个线性函数:interMap f g xs=foldr(\x r f g->f x:r g f)(\\\ uu->[])xs f g
。目标是避免库函数,原因未知。注意,在这种情况下,您也可以使用id
代替($)
,这可能使它更易于阅读。此外,您可以将l
全部删除(使其成为隐式参数)以获得更简洁的表达式。