如何在此Haskell列表函数中执行多个操作?
我来自Python,学习Haskell对我来说很难。例如,我得到了这个函数,它将合并列表。所以第一件事是合并列表,然后我想返回合并列表的总和。正确的语法是什么如何在此Haskell列表函数中执行多个操作?,haskell,functional-programming,Haskell,Functional Programming,我来自Python,学习Haskell对我来说很难。例如,我得到了这个函数,它将合并列表。所以第一件事是合并列表,然后我想返回合并列表的总和。正确的语法是什么 merge:: [[a]] -> [a] merge xss = foldr (++) [] xss return sum [] 只有删除最后一行,这段代码才有效。但是我想返回合并列表的总和。现在唯一得到的是编译时错误,抱怨代码中存在多个错误-我想最好是阅读一下haskell语法(例如) 你必须添加一个ty
merge:: [[a]] -> [a]
merge xss = foldr (++) [] xss
return sum []
只有删除最后一行,这段代码才有效。但是我想返回合并列表的总和。现在唯一得到的是编译时错误,抱怨代码中存在多个错误-我想最好是阅读一下haskell语法(例如) 你必须添加一个typeclass约束,这样你就可以添加列表中的元素——现在你说你的函数可以处理所有你能想到和不能想到的元素
merge:: Num a => [[a]] -> [a]
要在“合并”之后求和,如果要像开始那样编写,则必须声明一个中间变量
merge xss = let tmp = foldr (++) [] xss
in sum tmp
或者你可以写得短一点
merge xs = sum $ concat xs
或者,如果你想要更短的话,你可以选择免费
merge = sum . concat
您需要使用一些参数调用
foldr
,然后使用foldr
的结果调用sum
您可以通过以下方式轻松做到:
merge xss = sum (foldr (++) [] xss)
您不需要编写多个“语句”。您可以通过两个单独的函数来构建它:第一个函数实际进行合并,第二个函数进行求和。然而,组合这些(通过“组合”)应该以函数的方式进行:
f(g(x))
作为数学函数,或者在Haskell中fgx
。还要注意的是,总和的类型不是[a]
,而是a
,而且return
并不代表您认为它在Haskell中的含义。此外,return
也不是您认为它在Haskell中的含义。这并不意味着你认为它是什么(我知道有一个现有的答案,其中有许多建议;但是,没有一个直接向提问者展示如何编写他/她似乎正在尝试编写的代码,没有任何其他更改)同样,sum。映射和
:)
merge xss = sum (foldr (++) [] xss)