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