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

在haskell中使用foldl时不需要参数?,haskell,arguments,foldleft,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 或 但我不太明

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


但我不太明白第一个例子。因此,基本上我想知道,在haskell中,这样的计算是怎么可能的?

记住,haskell中的所有函数都是curry函数
foldl
也不例外;它具有类型
Foldable t=>(b->a->b)->b->ta->b
,这意味着它接受类型
(b->a->b)
的参数,并返回类型
Foldable t=>b->ta->b
的函数

该函数也被咖喱化
foldl(+)
接受类型为
intb=>b
的参数,并返回类型为
(Foldable t,Num b)=>tb->b
的函数

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

但我不太明白第一个例子。所以基本上我想知道,在haskell中,这样的评价是怎么可能的

foldl(+)0
生成一个函数。一个类型为
(可折叠f,Num A)=>fa->A
的函数,那么为什么需要一个额外的参数呢?
addAll
也是一个函数

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

foldl :: Foldable t => (b -> a -> b) ->  b ->  t a -> b
缩写为:

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

同样是一个函数,在这种情况下,它接受一个参数作为
foldl
的基本情况,然后返回一个映射a
(Foldable f,Num a)=>fa->fa
的函数。如果您编写
foldl(+)0
,这就是
(fold(+))0

foldl(+)0
生成一个将列表映射到求和的函数。从技术上讲,由于采用了currying,Haskell中的所有函数都只使用一个参数
foldl
接受一个参数,即代码中的
(+)
。恰好,
foldl(+)
的结果是一个函数,因此可以在代码中以某个内容作为其参数--
0
。新结果也是一个函数,因此它可以将
xs
作为参数。总而言之,
foldl
foldl(+)
foldl(+)0
foldl(+)0xs
都是有效的表达式。我刚刚和max一起试过,看看哪个数字更大,是10还是其他数字,效果如何。Haskell--max:(Ord a)=>a->(a->a)max10::Int->Int max10=max 10@DN:是的。所有函数都有一个参数,所以你可以让函数计算最大值,而不是10:)是的,我刚才读到Curried函数时注意到了这一点。非常感谢,理解curried函数是关键,尤其是“Haskell中的每个函数官方只接受一个参数”。
foldl :: Foldable t => (b -> a -> b) -> (b -> (t a -> b))
foldl (+) :: (Foldable f, Num b) => b -> (f b -> b)