繁体   English   中英

Haskell简单类型问题

[英]Haskell simple type issue

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

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

我认为您在这里采用了错误的方法。 直到编译器停止对您大喊大叫之前,您都无法通过构成您addTogether函数来获得可靠的addTogether函数。 这有点危险,Haskell和C都是如此。要么不使用这些函数,要么彻底阅读它们的文档,示例以及理想的代码。 那是我的意见。

关于addTogether ,有许多不同的实现方法。 如果您花了一个小时尝试使用zipmap而没有令人满意的结果,那么您可能会尝试其他方法。 例如,如果这是您的事,则可以递归的方式处理它:

addTogether :: Num t => ([t], [t]) -> [t] 
addTogether ([],_) = []
addTogether (_,[]) = []
addTogether ((x:xs),(y:ys)) = (x + y):addTogether (xs,ys)

这里没有歧义。 您也可以尝试使用列表理解(您想生成一个列表吗?),看起来可能像这样:

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]

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

@Daniel Fischer解决方案非常好,但是一开始使用uncurry可能会有点uncurry 您可以这样查看:

addTogether :: Num t => ([t],[t]) -> [t] 
addTogether (x, y) = zipWith (+) x y

我希望这对我的英语不好会有所帮助,并对不起。

您应该在此处使用的功能是

map :: (a -> b) -> [a] -> [b]

但是更好的选择是

addTogether :: Num t => ([t], [t]) -> [t]
addTogether = uncurry (zipWith (+))

mapM_的类型是

mapM_ :: Monad m => (a -> m b) -> [a] -> m ()

这显然达不到您的预期目的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM