有多少参数采用 Haskell 的 foldr 函数? [英] How many arguments takes the foldr function of Haskell?
问题描述
我是 Haskell 的新手,我正在阅读这本书 "Real世界 Haskell".在本书的第 4 章中,作者要求作为练习使用 fold 重写 groupBy 函数.该书的一位读者(Octavian Voicu)给出了以下解决方案:
I am new to Haskell and I am reading the book "Real World Haskell". In the Chapter 4 of the book the author asks as an exercise to rewrite the groupBy function using fold. One of the readers of the book (Octavian Voicu ) gave the following solution:
theCoolGroupBy :: (a -> a -> Bool) -> [a] -> [[a]]
theCoolGroupBy eq xs = tail $ foldr step (\_ -> [[]]) xs $ (\_ -> False)
where step x acc = \p -> if p x then rest p else []:rest (eq x)
where rest q = let y:ys = acc q in (x:y):ys
我的问题很简单:我知道 foldr 有 3 个参数:一个函数、一个初始值和一个列表.但是在代码的第二行 foldr 需要 4 个参数.为什么会这样?谢谢.
My question is simple: I know that foldr takes 3 arguments: a function, an initial value and a list. But in the second line of the code foldr takes 4 arguments. Why this happens? Thank you.
推荐答案
Scott 的回答是正确的,foldr
的结果是一个函数,所以这就是为什么看起来 foldr
需要 4 个参数.foldr
函数接受 3 个参数(函数、基数、列表):
Scott's answer is correct, the result of the foldr
is a function, so this is why it seems that foldr
takes 4 arguments. The foldr
functions does take 3 arguments (function, base, list):
*Main> :type foldr
foldr :: (a -> b -> b) -> b -> [a] -> b
这里我只举一个不那么复杂的例子:
I'll just give here an example that is less complex:
inc :: Int -> (Int -> Int)
inc v = \x -> x + v
test = inc 2 40 -- output of test is 42
在上面的代码中,inc
接受一个参数,v
,并返回一个将其参数增加 v
的函数.
In the above code, inc
takes one argument, v
, and returns a function that increments its argument by v
.
如下所示,inc 2
的返回类型是一个函数,所以它的参数可以简单地加在最后:
As we can see below, the return type of inc 2
is a function, so its argument can simply be added at the end:
*Main> :type inc
inc :: Int -> Int -> Int
*Main> :type inc 2
inc 2 :: Int -> Int
*Main> :type inc 2 40
inc 2 40 :: Int
括号可以用来强调返回值是一个函数,但在功能上和上面的代码是一样的:
Parentheses could be used to emphasize that the return value is a function, but functionally it is identical to the above code:
*Main> (inc 2) 40
42
PS:我是原评论的作者 :)
PS: I'm the author of the original comment :)
这篇关于有多少参数采用 Haskell 的 foldr 函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!