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

Arguments not needed when using foldl in haskell?

我不明白的是如何在 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?

中那样评估某些东西

请记住 Haskell 中的所有函数都是柯里化的。 foldl也不例外;它有类型 Foldable t => (b -> a -> b) -> b -> t a -> b,这意味着它接受类型 (b -> a -> b) 的参数和 returns 类型 Foldable t => b -> t a -> b.

的函数

该函数 柯里化了。 foldl (+) 接受类型 Int b => b 的参数,returns 接受类型 (Foldable t, Num b) => t b -> b.

的函数

因此,foldl (+) 0 的类型为 (Foldable t, Num b) => t b -> b,并且您的类型注释限制了 t ~ []b ~ Int

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 也是一个函数。

在函数式编程中,函数是“第一个 class 公民”。这意味着您可以将函数作为参数传递,并且结果可以是一个函数。在 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 的基本情况,returns 然后是一个映射 (Foldable f, Num a) => f a -> f a 的函数。如果你写 foldl (+) 0,那么这是 (fold (+)) 0.

的缩写