目前我正在摆弄 Haskell。我对 Haskell(以及一般的函数式语言)的了解仍然很少,但我正在努力。真正困扰我的是一个(正如我所想的)简单的任务:以每个深度折叠一次的方式折叠嵌套列表。
fcalc = foldr (\x y -> (foldr (**) 1 x) * (foldr (**) 1 y)) [1.0, 1.0] [[2.0, 3.0], [4.0, 5.0]]
Run Code Online (Sandbox Code Playgroud)
它应该做什么:2^3 * 4^5,其中 ^ 由 lambda 内部折叠完成。遗憾的是它不起作用。
Occurs check: cannot construct the infinite type: t0 = [t0]
In the third argument of `foldr', namely `y'
Run Code Online (Sandbox Code Playgroud)
我读过一些关于给定的“无限类型”错误的信息,主要表明变量被用作例如元素,而它是一个列表。这让我将外文件夹的第二个参数视为问题,但没有成功。我就是不明白。:/
您的问题是您试图a^b在折叠内的累加器上进行计算,同时也在每个元素上进行计算。你真正想要的是类似的东西
fcalc = foldr (\x y -> (foldr (**) 1 x) * y) 1 [[1.0, 1.0], [2.0, 3.0], [4.0, 5.0]]
Run Code Online (Sandbox Code Playgroud)
请记住,每个步骤的输出都foldr将作为下一步的第二个参数(例如y本例中的变量)插入。由于您的foldr步骤返回一个数字,因此该y变量已经是一个数字,因此您无法折叠它。