【问题标题】:Pattern matching equivalent variables in Haskell, like in PrologHaskell 中的模式匹配等效变量,例如 Prolog
【发布时间】:2010-11-04 00:37:59
【问题描述】:

在 prolog 中,我们可以这样做:

myFunction a (a:xs) = ...

也就是说,当myFunction 的第一个参数与第二个参数中的列表的第一项相同时,此函数将评估为...

我现在的问题是......如何在 Haskell 中完成类似的事情? 我认为 Prolog 的模式匹配比 Haskell 的更具表现力。我一直在尝试在 Haskell 中编写代码,但遇到了麻烦——要么我使用了无效的语法,要么上述技巧根本行不通。

【问题讨论】:

    标签: haskell syntax prolog pattern-matching unification


    【解决方案1】:

    Haskell 不做这种“变量匹配”。您必须明确表示:

    myFunction a (x:xs)
        | x == a = ...
    

    【讨论】:

      【解决方案2】:

      Haskell 不像 Prolog 那样统一变量。正如Haskell 98 report 所说,

      每个匹配对应的模式集合必须是线性的---在整个集合中不允许变量出现超过一次。

      您当然可以命名变量,并声明它们也必须相等:

      f a (b:_) | a == b = ...
      

      有趣的是,Agda 确实让信息在这样的模式中流动,并引入了一个特殊的符号f x (.x:_) 来表示这个x 必须是那个x

      【讨论】:

      • 在 scala 中,您可以使用 x 来表示与变量值匹配的模式,例如 agda 案例。
      【解决方案3】:

      在 Haskell 中,您不能在模式匹配中进行这样的隐式比较。相反,您需要添加一个明确进行比较的守卫,如下所示:

      myFunction a (b:xs) | a == b = ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多