【发布时间】:2014-02-15 00:28:44
【问题描述】:
以下作品:
fib n = let
f k a b =
if k==n then b
else f (k+1) b (a+b)
in f 1 0 1
但我尝试将 if-then-else 重写为模式匹配,我收到有关重叠模式的警告,它会产生错误的结果(始终为 1)
fib n = let
f n a b = b
f k a b = f (k+1) b (a+b)
in f 1 0 1
为什么?
或者更一般地说,您可以在闭包中进行模式匹配吗?
【问题讨论】:
-
我省略了“fib 0 = 0”以避免分心
-
ninf n a b不是来自fib n的n。这是一个新的。 -
@Zeta:谢谢,我怎样才能使它成为具有模式匹配的闭包,或者它不能在 Haskell 中完成?
-
既然除了计算迭代次数之外你没有使用
k,为什么不倒计时呢?然后你可以在 1 上匹配。 -
@molbdnilo:是的,我知道,但我很想知道为什么这不起作用(顺便说一下,如果你从 fib 数字开始向上计数,更容易说服自己代码正常工作也“向上”生成)
标签: haskell pattern-matching closures