Haskell模式匹配数字(解构)

5

在Haskell中,模式匹配能否用于以这种方式分解数字:

f (n + 1) = n

我期望找到前置条件,例如: f 6 = 5, f 5 = 4等。

我在这里发现了这种模式匹配的用法: https://wiki.haskell.org/Continuation

 facCPS :: a -> (a -> r) -> r
 facCPS 0 k = k 1
 facCPS n'@(n + 1) k = facCPS n $ \ret -> k (n' * ret)
 facCPS 4 (+ 2) :: Integral a => a

但是在我的ghci中它不起作用:

Prelude> f (n + 1) = n :4:12: 错误:模式匹配中的解析错误:n + 1

也许需要添加一些选项?我可以以某种方式使用模式匹配吗?


4
曾经可以做到这一点,但后来被取消了。你可能可以通过使用语言指示符重新启用它;我不确定。你要寻找的是“n+k模式”。 - MathematicalOrchid
1
{-# LANGUAGE NPlusKPatterns #-} 会使得该示例工作。 - Marc Talbot
值得注意的是,f n = n - 1将具有完全相同的效果,并且不需要语言扩展。(但您可能需要重写递归的基本情况。) - Robin Zigmond
@RobinZigmond 当然,做事情通常有几种方法,但问题是关于解构和模式匹配的。 - Evg
1个回答

4

使用您引用的维基百科示例:

{-# LANGUAGE NPlusKPatterns #-}
fac :: Integral a => a -> a
fac 0 = 1
fac n'@(n + 1) = n' * fac n

自2010年起,Haskell将这一特性移除,但它仍然是一种非常可配置的语言。 :)

谢谢,我也在ghci中添加了Prelude> :set -XNPlusKPatterns Prelude> f(n + 1) = n Prelude> f 5 - Evg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接