如何解决在haskell中使用foldl时不需要参数吗?
我不明白的是如何在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)
的参数并返回类型为Foldable t => b -> t a -> b
的函数。
该功能也是 。 foldl (+)
接受类型为Int b => b
的参数,并返回类型为(Foldable t,Num b) => t b -> b
的函数。
因此,foldl (+) 0
的类型为(Foldable t,Num b) => t b -> b
,而您的类型注释会限制t ~ []
和b ~ Int
。
但是我不太理解第一个例子。因此,基本上我想知道如何在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 -> (t a -> b))
因此, foldl
是一个函数,它以类型为(b -> a -> b)
的函数为参数,并产生类型为b -> t a -> b
的函数。因此,这意味着foldl (+)
具有类型:
foldl (+) :: (Foldable f,Num b) => b -> (f b -> b)
再次是一个函数,该函数在这种情况下以参数foldl
为基数,然后返回一个映射(Foldable f,Num a) => f a -> f a
的函数。如果您写foldl (+) 0
,这就是(fold (+)) 0
的缩写。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。