zipWith函数使用Map和Zip函数实现

时间:2017-10-30 02:35:50

标签: haskell syntax syntax-error

我正在尝试通过zipWithzip函数实现map函数,但是我收到的错误是:"错误:输入错误解析错误#39; ::'我的代码在下面,我不确定我做错了什么

zipWith` :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith` f x y = zip x $ map f y

2 个答案:

答案 0 :(得分:8)

您必须使用'符号,而不是`;然后,结合您需要使用的功能uncurry

zipWith' :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith' f xs ys  = map (uncurry f) (zip xs ys)

为什么这样,zip的类型是:

zip :: [a] -> [b] -> [(a, b)]

但函数ff :: (a -> b -> c),因此,在uncurry的帮助下,

uncurry :: (a -> b -> c) -> (a, b) -> c

您可以将函数f映射到[(a, b)],并将其转换为[c]

答案 1 :(得分:2)

正如Damian所指出的那样,zipWith`并不适用于尾随反引号 - 反引号在Haskell中具有特殊含义。将其重命名为zipWith'

zipWith' :: (a -> b -> c) -> [a] -> [b] -> [c]

然后当然你必须解决方案。通过明确的递归,您已经

zipWith' _ _ []          = []
zipWith' _ [] _          = []
zipWith' f (x:xs) (y:ys) = f x y : zipWith' f xs ys

但是使用mapzip您可以像这样应用它:

zipWith' f xs ys = map (\(x,y) -> f x y) . zip xs $ ys

或更容易阅读:

zipWith' f xs ys = map (\(x,y) -> f x y) zipped
    where zipped = zip xs ys