【问题标题】:Pattern matching on IntsInts 上的模式匹配
【发布时间】:2015-09-30 14:25:08
【问题描述】:

我是学习 Haskell 的初学者,我想知道您是否可以像这样在 Ints 上进行模式匹配:

 add x 0 = x
 add x (1 + y) = 1 + x  + add x y,

或者可以这样:

 add x 0 = x
 add x (successor y) = 1 + x + add x y

【问题讨论】:

  • 如果您觉得下面有合适的答案,请考虑点击勾选@user12596 接受它。

标签: function haskell types functional-programming pattern-matching


【解决方案1】:

您的代码格式有点偏离,因此很难知道您在问什么,但您可以使用模式匹配来输入 Int 类型。一个例子是

add x 0 = x
add x y = x + y

【讨论】:

    【解决方案2】:

    模式匹配不是任意案例分析。这是一种规范但有限的案例分析形式,其中案例是数据类型的构造函数

    在模式匹配整数的特定情况下,构造函数被视为整数。所以你可以使用整数值作为模式匹配的案例:

    foo 0 = ...
    foo 2 = ...
    foo x = ...
    

    但你不能使用任意表达式。以下代码是非法的:

    foo (2 * x) = ...
    foo (2 * x + 1) = ...
    

    可能知道整数的形式是2 * x2 * x + 1。但是类型系统不知道。

    【讨论】:

    • 公平地说,在haskell98中你可以匹配(x + 5),这样的匹配对于小于5的数字会失败,而对于所有其他数字成功并减去5。该功能被发现无用并从 haskell2010 中删除,GHC 支持它作为扩展。
    【解决方案3】:

    有一个扩展可以让你做到这一点,但你应该简单地对y进行模式匹配,然后手动减去1

    add x y = 1 + x + add x (y - 1)
    

    扩展名为NPlusKPatterns。如果您真的想使用它(请记住它在 haskell 2010 中已弃用),可以通过将 -XNPlusKPatterns 参数传递给 GHC 或在顶部放置 {-# LANGUAGE NPlusKPatterns #-} 来启用它你的文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 2016-11-27
      • 2018-11-09
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多