Haskell简单类型问题

kva*_*nck 0 haskell types

我正在尝试编写一个函数,将两个数组的所有元素一起添加并返回一个数组.它输入了两个列表.

addTogether :: Num t => ([t],[t]) -> [t]
addTogether (x, y) = mapM_ (\ (a, b) -> a + b) (zip x y)
Run Code Online (Sandbox Code Playgroud)

Jer*_*ome 8

我想你在这里采取了错误的做法.addTogether在编译器停止对你大喊大叫之前,你不会通过编写模糊理解的函数来获得可靠的函数.它有点危险,Haskell和C都是如此.要么你不使用这些函数,要么你彻底阅读他们的文档,示例和理想的代码.这是我的意见.

关于addTogether,有许多不同的方法来实现它.如果你花了一个小时试图使用zipmap没有任何令人满意的结果,那么你可能会尝试别的东西.例如,如果这是您的事情,您可以以递归方式处理它:

addTogether :: Num t => ([t], [t]) -> [t] 
addTogether ([],_) = []
addTogether (_,[]) = []
addTogether ((x:xs),(y:ys)) = (x + y):addTogether (xs,ys)
Run Code Online (Sandbox Code Playgroud)

这里没有含糊之处.您还可以尝试使用列表推导(您希望生成一个列表吗?),可能如下所示:

addTogether :: Num t => ([t],[t]) -> [t] 
addTogether (x, y)
    | null x || null y = []
    | otherwise = [ a + b | n <- [0..min (length x) (length y) - 1],
                            let a = x!!n,
                            let b = y!!n]
Run Code Online (Sandbox Code Playgroud)

(它没有处理无限列表,我很快就做到了)

@Daniel Fischer解决方案非常好,但uncurry起初可能有点令人不安.你可以这样看:

addTogether :: Num t => ([t],[t]) -> [t] 
addTogether (x, y) = zipWith (+) x y
Run Code Online (Sandbox Code Playgroud)

我希望这对我英语不好有帮助和抱歉.


Dan*_*her 7

你应该使用的功能是

map :: (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

但是更好的选择就是

addTogether :: Num t => ([t], [t]) -> [t]
addTogether = uncurry (zipWith (+))
Run Code Online (Sandbox Code Playgroud)

类型mapM_

mapM_ :: Monad m => (a -> m b) -> [a] -> m ()
Run Code Online (Sandbox Code Playgroud)

这显然不符合您的预期目的.