Pattern matching equivalent variables in Haskell, like in Prolog

我是研究僧i 提交于 2019-11-28 03:16:30

问题


In prolog, we can do something like the following:

myFunction a (a:xs) = ...

This is, when the 1st argument of myFunction is the same as the first item of the list that's in the 2nd argument, this function will evaluate to ....

My question now is... how to accomplish a similar thing in Haskell? I have the idea that Prolog's Pattern Matching is more expressive than Haskell's. I've been trying to code that in Haskell and I'm having trouble -- either I am using invalid syntax or the above trick will simply not do.


回答1:


Haskell doesn't do this kind of "variable matching". You'll have to explicitly put a guard on:

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



回答2:


Haskell doesn't do unification of variables, as Prolog does. As the Haskell 98 report says,

The set of patterns corresponding to each match must be linear---no variable is allowed to appear more than once in the entire set.

You can of course name the variables, and state they must also be equal:

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

Interestingly, Agda does let information flow across patterns like this, and introduces a special notation f x (.x:_) to say that this x must be that x.




回答3:


In Haskell, you can't do implicit comparisons like this in a pattern match. Instead, you'll need to add a guard which explicitly does the comparison, like so:

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


来源:https://stackoverflow.com/questions/4092962/pattern-matching-equivalent-variables-in-haskell-like-in-prolog

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!