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