Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在此Haskell列表函数中执行多个操作?_Haskell_Functional Programming - Fatal编程技术网

如何在此Haskell列表函数中执行多个操作?

如何在此Haskell列表函数中执行多个操作?,haskell,functional-programming,Haskell,Functional Programming,我来自Python,学习Haskell对我来说很难。例如,我得到了这个函数,它将合并列表。所以第一件事是合并列表,然后我想返回合并列表的总和。正确的语法是什么 merge:: [[a]] -> [a] merge xss = foldr (++) [] xss return sum [] 只有删除最后一行,这段代码才有效。但是我想返回合并列表的总和。现在唯一得到的是编译时错误,抱怨代码中存在多个错误-我想最好是阅读一下haskell语法(例如) 你必须添加一个ty

我来自Python,学习Haskell对我来说很难。例如,我得到了这个函数,它将合并列表。所以第一件事是合并列表,然后我想返回合并列表的总和。正确的语法是什么

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)