首页 文章

模式匹配Haskell中的等效变量,就像在Prolog中一样

提问于
浏览
9

在prolog中,我们可以执行以下操作:

myFunction a (a:xs) = ...

这是,当 myFunction 的第一个参数与第二个参数中列表的第一个项相同时,此函数将计算为 ... .

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

3 回答

  • 12

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

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

    Haskell不会做这种“变量匹配” . 你必须明确地保护:

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

    正如Prolog所做的那样,Haskell没有统一变量 . 正如Haskell 98 report所说,

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

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

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

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

相关问题