0

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

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

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

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

4

1 回答 1

0

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

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

case g x y of g a b -> a

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

case y of g a b -> a

但那a可能是任何东西。

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

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
于 2015-10-25T08:17:23.903 回答