我来自Python,对我来说很难学习Haskell。例如,我得到这个函数将合并列表。所以第一件事是合并列表,然后我想返回合并列表的总和。如何正确的语法?如何在此Haskell列表函数中执行多个操作?
merge:: [[a]] -> [a]
merge xss = foldr (++) [] xss
return sum []
这段代码只有在删除最后一行时才有效。但是我想返回合并列表的总和。
我来自Python,对我来说很难学习Haskell。例如,我得到这个函数将合并列表。所以第一件事是合并列表,然后我想返回合并列表的总和。如何正确的语法?如何在此Haskell列表函数中执行多个操作?
merge:: [[a]] -> [a]
merge xss = foldr (++) [] xss
return sum []
这段代码只有在删除最后一行时才有效。但是我想返回合并列表的总和。
现在你唯一得到的是一个编译时错误,抱怨在你的代码的多个错误 - 我想,最好的办法是阅读一些关于Haskell语法(如http://learnyouahaskell.com)
merge :: [[a]] -> [a]
你必须添加一个typeclass约束,所以你可以添加一个列表的元素 - 现在你说你的函数可以处理所有可能的元素,你可以想象得到。
merge:: Num a => [[a]] -> [a]
总结“合并”之后,如果要像开始一样写入中间变量,则必须声明中间变量。
merge xss = let tmp = foldr (++) [] xss
in sum tmp
,或者你可以把它写短一点
merge xs = sum $ concat xs
或pointfree如果你想更短
merge = sum . concat
在你的第三段代码中,你缺少了'在' – bwroga
thx - 修好了! – epsilonhalbe
要拨打foldr
一些参数,然后调用sum
结果为foldr
。
您可以通过书面形式,很容易:
merge xss = sum (foldr (++) [] xss)
你并不需要写多个“声明”。
(我知道有很多建议的现有答案;但是,这些都没有直接显示提问者如何编写他/她似乎试图编写的代码,而没有任何其他更改) – immibis
您可以从两个单独的函数构建它:第一个实际上合并,第二个合并。但是,将这些(通过“合成”)结合起来应该以功能的方式完成:'f(g(x))'作为数学函数,或者在Haskell中'f g x'。请注意,总和的类型不是'[a]',而是'a',并且'return'并不意味着您认为它在Haskell中意味着什么。 –
也,'返回'是不是你在Haskell。 – karakfa
['return'](http://stackoverflow.com/questions/15323927/whats-so-special-about-return-keyword)并不意味着你的想法 – jkeuhlen