在haskell中使用foldl时不需要参数?
我不明白的是,如何在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 或 但我不太明
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)