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 开发者_StackOverflow中文版am using invalid syntax or the above trick will simply not do.
Haskell doesn't do this kind of "variable matching". You'll have to explicitly put a guard on:
myFunction a (x:xs)
| x == a = ...
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
.
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 = ...
精彩评论