Haskell 括号内的模式匹配

Haskell pattern matching inside parentheses

我想定义一个函数,它对特定类型的表达式进行操作,但可以访问其内部结构(如果有的话)。比如下面的f:

g :: a -> a -> a
g x y = y

f :: a -> a
f x'@(g x y) = x'
f _ = 1

(g x y)是a类型,所以f应该可以作为参数,但是上面f的定义不能被Haskell解析。我想定义类似 f 的东西以利用按名称调用评估。在 Haskell 中有什么方法可以做到这一点吗?

首先,模式匹配只允许在模式上进行,即从应用程序、构造函数和变量构建的表达式(最多使用一次)。

其次,即使它被扩展了,你的例子也是有问题的,因为你的g不是内射的:

case g x y of g a b -> a

应该等于,因为g x y = y

case y of g a b -> a

但是 a 可以是任何东西。

如果碰巧 g 是由一个可能是模式的表达式定义的,那么如果您通过 PatternSynonyms GHC 扩展请求它,GHC 可以允许将它用作模式。

pattern G a b = ("hello", b, a)

foo = case someTriple of
        G a b     -> use a b
        (s, x, y) -> ...

bar = G 4 5       -- we can also use G as a function