因此,为了找出给定堆栈的大小,我使用以下函数:
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
答案 0 :(得分:3)
const
忽略了它的论点。
因此在sizeStack中,它占用了堆栈的每个元素,并将1加到累加器中。
它不需要查看堆栈上的值来计算它。知道只有一个元素就足够了。所以const
是合适的。
答案 1 :(得分:3)
它有助于将其可视化如下:
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
。