模式匹配相同的值

Dar*_*rio 22 f# haskell functional-programming pattern-matching guard-clause

我只是想知道是否可以使用函数式编程语言(Haskell/F#/ Caml)的模式匹配工具多次匹配相同的值.

试想下面的例子:

plus a a = 2 * a
plus a b = a + b
Run Code Online (Sandbox Code Playgroud)

当使用两个相似的值(将存储在其中a)调用函数时,将调用第一个变体.

一个更有用的应用程序就是这个(简化AST).

simplify (Add a a) = Mult 2 a
Run Code Online (Sandbox Code Playgroud)

但是Haskell拒绝这些代码并警告我有相互矛盾的定义a - 我必须做明确的case/if-checks而不是找出函数是否具有相同的值.是否有任何技巧可以表明我想要匹配的变量会多次出现?

Tho*_*mas 40

这称为非线性模式.不久前,haskell-cafe邮件列表中有几个关于此的线程.这是两个:

http://www.mail-archive.com/haskell-cafe@haskell.org/msg59617.html

http://www.mail-archive.com/haskell-cafe@haskell.org/msg62491.html

底线:实现并非不可能,但为了简单起见,我们决定采用这种做法.

顺便说一句,你不需要ifcase解决这个问题; (稍微)更清洁的方法是使用警卫:

a `plus` b
  | a == b = 2*a
  | otherwise = a+b
Run Code Online (Sandbox Code Playgroud)


sth*_*sth 14

您不能使用两个具有相同名称的参数来表示它们应该相等,但您可以使用保护来区分这样的情况:

plus a b
  | a == b    = 2 * a
  | otherwise = a + b
Run Code Online (Sandbox Code Playgroud)

这更灵活,因为它也适用于比简单相等更复杂的条件.