【问题标题】:haskell pattern match numbers (deconstruction)haskell 模式匹配数(解构)
【发布时间】:2021-02-12 18:08:04
【问题描述】:

Haskell 中的模式匹配可以用这种方式解构数字吗:

f (n + 1) = n

我期望 ex 的前身: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 中它不起作用:

前奏曲> f (n + 1) = n :4:12: 错误:模式中的解析错误:n + 1

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

【问题讨论】:

  • 曾经是可能的,但后来被删除了。您可能可以使用语言编译指示重新打开它;我不知道。您正在寻找“n+k 模式”。
  • {-# LANGUAGE NPlusKPatterns #-} 将使该示例工作。
  • 值得注意的是f n = n - 1 将具有完全相同的效果,并且不需要语言扩展。 (不过,您可能必须重写递归的基本情况。)
  • @RobinZigmond 当然,做事通常有几种方法,但问题是关于解构和模式匹配

标签: haskell pattern-matching


【解决方案1】:

使用您引用的 wiki 中的示例:

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

这在 2010 年从语言中删除,但 Haskell 仍然是一种非常可配置的语言。 :)

【讨论】:

  • thx,我也在 ghci 中添加了 Prelude> :set -XNPlusKPatterns Prelude> f(n + 1) = n Prelude> f 5
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 2021-05-22
  • 2017-08-04
相关资源
最近更新 更多