haskell - 在 haskell 中使用 foldl 时不需要参数?

标签 haskell arguments foldleft

我不明白的是如何在 haskell 中以这种方式使用 foldl。我不明白参数(在本例中为列表)是如何隐式传递的:

addAll :: [Int] -> Int
addAll =  foldl (+) 0

-- This is how I could write foldl to simplify addAll where xs is clearly defined

addAll :: [Int] -> Int
addAll xs = foldl (+) 0 xs

addAll :: [Int] -> Int
addAll = \ xs -> foldl (+) 0 xs

但是我不是很理解第一个例子。所以基本上我想知道如何在 haskell 中像这样评估某些东西?

最佳答案

But I don't really understand the first example. So basically I wonder how it is possible for something to be evaluated like that in haskell?

foldl (+) 0 产生一个函数。类型为 (Foldable f, Num a) => f a -> a 的函数,那么为什么需要额外的参数呢? addAll 也是一个函数。

在函数式编程中,函数是“一等公民”。这意味着您可以将函数作为参数传递,并且结果可以是一个函数。在 Haskell 中,每个函数都恰好接受一个参数。确实:

foldl :: Foldable t => (b -> a -> b) ->  b ->  t a -> b

是以下的缩写:

foldl :: Foldable t => (b -> a -> b) -> <b>(</b>b -> <b>(</b>t a -> b<b>))</b>

foldl 因此是一个函数,它将 (b -> a -> b) 类型的函数作为参数,并生成 b 类型的函数-> t a -> b。因此,这意味着 foldl (+) 具有以下类型:

foldl (+) :: (Foldable f, Num b) => b -> <b>(</b>f b -> b<b>)</b>

再次是一个函数,在这种情况下,它采用 foldl 的基本情况作为参数,然后返回一个映射 (Foldable f, Num a) => f a -> f a 的函数。如果您编写 foldl (+) 0,则这是 (fold (+)) 0 的缩写。

关于haskell - 在 haskell 中使用 foldl 时不需要参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64322905/

相关文章:

haskell - 为什么 2 元组 Functor 实例只将函数应用于第二个元素?

haskell - 如何使用 hFileSize 在 Haskell 中获取文件大小

c++ - 从模板中的另一个类名派生一个类名

javascript - 有人可以用外行人的术语向我解释这个foldl 示例吗?

scala - 如何将尾递归方法转换为更像Scala的函数?

list - 如何计算元素大于其后继元素的次数?

Haskell——双重人格IO/ST monad?

haskell - Haskell 中的组织同态示例

c# - 有没有更简单的方法将一组变量作为数组传递

c# - 在覆盖基本方法时,为什么默认参数不能正常工作?