在不改变列表的情况下,指出列表中的所有元素

Jho*_*uck 2 haskell list fold

名单是

[2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

我希望对每个结果进行取幂.那么,它将是:

(2 ^ 3)^ 4 = 4096

我的解决方案是

  • 使用foldl
  • 手动设置列表的第一个元素作为基本案例
  • 手动设置基础案例作为列表的第一个元素

代码是

foldl (^) 2 [1, 3, 4]
Run Code Online (Sandbox Code Playgroud)

跟踪是

((2 ^ 1)^ 3)^ 4 = 4096

有没有改变清单的解决方案?

Wil*_*sem 6

是的,如果保证列表具有第一个元素,我们可以使用foldl1 :: (a -> a -> a) -> [a] -> a它使用列表的第一个元素作为初始累加器.所以我们可以使用:

foldl1 (^) [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

这当然会产生相同的结果:

Prelude> foldl1 (^) [2,3,4]
4096
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用列表,则上述函数将出错.所以你需要通过一些额外的逻辑来处理这种情况 - 如果可能的话.