括号内的Haskell模式匹配

时间:2015-10-25 01:25:14

标签: haskell pattern-matching callbyname

我想定义一个对某个类型的表达式进行操作的函数,但是如果它有一个,则可以访问它的内部结构。例如,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有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

首先,模式匹配仅适用于模式,即从应用程序,构造函数和变量构建的表达式(最多使用一次)。

其次,即使它被扩展,你的例子也会有问题,因为你的g不是唯一的:

case g x y of g a b -> a

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

case y of g a b -> a

然后a可能是任何东西。

相反,如果g由可能是模式的表达式定义,那么GHC可以允许将其用作模式,如果您通过PatternSynonyms 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