(const(+1))在此haskell表达式中的含义?

(const(+1))在此haskell表达式中的含义?,haskell,stack,constants,Haskell,Stack,Constants,因此,为了找出给定堆栈的大小,我使用以下函数: sizeStack :: S.Stack a -> Int sizeStack = foldrStack (const (+1)) 0 其中“foldrStack”是: foldrStack :: (a -> b -> b) -> b -> S.Stack a -> b foldrStack f z s | S.isEmpty s = z | otherwise = S.top s `f` foldrS

因此,为了找出给定堆栈的大小,我使用以下函数:

sizeStack :: S.Stack a -> Int
sizeStack = foldrStack (const (+1)) 0
其中“foldrStack”是:

foldrStack :: (a -> b -> b) -> b -> S.Stack a -> b
foldrStack f z s
  | S.isEmpty s = z
  | otherwise = S.top s `f` foldrStack f z (S.pop s)
我的问题是:const在sizeStack中到底扮演什么角色

另外,为了将函数应用于堆栈中的所有元素,我使用了这个函数。你有更好的选择吗

mapStack :: (a -> b) -> S.Stack a -> S.Stack b
mapStack f s = foldrStack (S.push . f) S.empty s
const忽略了它的论点

因此,在sizeStack中,它接受堆栈中的每个元素,并向累加器添加1。 它不需要查看堆栈上的值就可以对其进行计数。只要知道有一个元素就足够了。所以const是合适的。

const忽略了它的参数

因此,在sizeStack中,它接受堆栈中的每个元素,并向累加器添加1。
它不需要查看堆栈上的值就可以对其进行计数。只要知道有一个元素就足够了。所以常数是合适的。

它有助于可视化它,如下所示:

f = const (+1)
-- eta expand
f x = const (+1) x
-- definition of const:   const a b = a
f x = (+1)
-- eta expand
f x y = (+1) y
-- operator section
f x y = y+1
因此,您的代码相当于

sizeStack = foldrStack (\ x y -> y+1) 0    

正如Don Stewart所解释的,这意味着丢弃元素x并增加计数器y。

这有助于可视化它,如下所示:

f = const (+1)
-- eta expand
f x = const (+1) x
-- definition of const:   const a b = a
f x = (+1)
-- eta expand
f x y = (+1) y
-- operator section
f x y = y+1
因此,您的代码相当于

sizeStack = foldrStack (\ x y -> y+1) 0    
正如Don Stewart所解释的,这意味着丢弃元素x并增加计数器y