【问题标题】:haskell parse error in pattern for n+k patternhaskell 解析 n+k 模式的模式错误
【发布时间】:2012-12-24 09:57:45
【问题描述】:

我已经开始通过 Erik Meijer 的 13-part lectures(和 Graham Hutton 的 slides)学习 Haskell。

在第 4 章第 13 页的幻灯片上,它介绍了 n+k 模式的模式匹配语法。特别是,它说:

在数学中,整数上的函数可以使用 n+k 来定义 模式,其中 n 是一个整数变量,k>0 是一个整数 常数。

pred :: Int -> Int
pred (n+1) = n

当我在 REPL 中自己尝试此操作时,我收到一条错误消息:

*Main> let mypred (n+1) = n

<interactive>:65:13: Parse error in pattern: n + 1

同样,如果我在 *.hs 文件中尝试它

mypred :: Int -> Int
mypred (n+1) = n

编译器给出了类似的抱怨:

/Users/pohl/Code/praxis-haskell/helloworld.hs:14:9:
    Parse error in pattern: n + 1

我是否不明白如何使用 n+k 模式?

【问题讨论】:

标签: haskell pattern-matching ghci


【解决方案1】:

您必须通过-XNPlusKPatterns 启用它。

ghci -XNPlusKPatterns
Prelude> let mypred (n+1) = n
Prelude> mypred 2
1

类似地在hs 文件中。

{-# LANGUAGE NPlusKPatterns #-}

mypred :: Int -> Int
mypred (n+1) = n

在 ghci 中加载后

*Main> mypred 2
1

【讨论】:

  • 嗯,成功了。 (谢谢!)这是一个实验性功能吗?有人知道为什么需要以这种方式启用吗?
  • @pohl 我认为它已被删除,现在只能作为扩展使用。 hackage.haskell.org/trac/haskell-prime/wiki/RemoveNPlusK
  • 酷。这是对产生如此优雅语言的那种思维的一瞥。看到一些东西被移除真是令人耳目一新!
  • @pohl:是的! “在许多情况下,它不是填充氦气球,而是切断让你飞上高空的沙袋。” (找到wadler.blogspot.com/2012_05_01_archive.html
【解决方案2】:

我是否不了解如何使用 n+k 模式?

实际上,如今n+k 模式被认为是不好的做法。这样做的主要原因是语法在 Haskell 中看起来并不像其他任何东西,+ 部分并没有真正使用范围​​内的+,这与do 符号的工作方式不同。此外,viewpatterns 扩展是一种概括,在许多更多设置中很有用。

有更多信息 here 说明它被删除的原因。

【讨论】:

    猜你喜欢
    • 2012-01-23
    • 2013-01-29
    • 1970-01-01
    • 2015-03-14
    • 2019-05-03
    • 2013-12-24
    • 2012-09-28
    • 2017-10-29
    • 2017-07-18
    相关资源
    最近更新 更多