Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Haskell函数,可交替应用输入一元函数_List_Function_Haskell_Input_Winghci - Fatal编程技术网

List Haskell函数,可交替应用输入一元函数

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

我试图编写一个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 = 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
全部删除(使其成为隐式参数)以获得更简洁的表达式。