2017-05-08 123 views
0

我来自Python,对我来说很难学习Haskell。例如,我得到这个函数将合并列表。所以第一件事是合并列表,然后我想返回合并列表的总和。如何正确的语法?如何在此Haskell列表函数中执行多个操作?

merge:: [[a]] -> [a] 
merge xss = foldr (++) [] xss 
      return sum [] 

这段代码只有在删除最后一行时才有效。但是我想返回合并列表的总和。

+0

您可以从两个单独的函数构建它:第一个实际上合并,第二个合并。但是,将这些(通过“合成”)结合起来应该以功能的方式完成:'f(g(x))'作为数学函数,或者在Haskell中'f g x'。请注意,总和的类型不是'[a]',而是'a',并且'return'并不意味着您认为它在Haskell中意味着什么。 –

+1

也,'返回'是不是你在Haskell。 – karakfa

+2

['return'](http://stackoverflow.com/questions/15323927/whats-so-special-about-return-keyword)并不意味着你的想法 – jkeuhlen

回答

6

现在你唯一得到的是一个编译时错误,抱怨在你的代码的多个错误 - 我想,最好的办法是阅读一些关于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 
+0

在你的第三段代码中,你缺少了'在' – bwroga

+0

thx - 修好了! – epsilonhalbe

1

要拨打foldr一些参数,然后调用sum结果为foldr

您可以通过书面形式,很容易:

merge xss = sum (foldr (++) [] xss) 

你并不需要写多个“声明”。

+0

(我知道有很多建议的现有答案;但是,这些都没有直接显示提问者如何编写他/她似乎试图编写的代码,而没有任何其他更改) – immibis

相关问题