我正在尝试通过zipWith
和zip
函数实现map
函数,但是我收到的错误是:"错误:输入错误解析错误#39; ::'我的代码在下面,我不确定我做错了什么
zipWith` :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith` f x y = zip x $ map f y
答案 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)]
但函数f
为f :: (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
但是使用map
和zip
您可以像这样应用它:
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