我想定义一个函数,该函数对某种类型的表达式进行操作,但可以访问其内部结构(如果有的话)。例如,下面的 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 中有什么方法可以做到这一点吗?
我想定义一个函数,该函数对某种类型的表达式进行操作,但可以访问其内部结构(如果有的话)。例如,下面的 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 中有什么方法可以做到这一点吗?
首先,模式匹配只允许在模式上进行,即从应用程序、构造函数和变量构建的表达式(最多使用一次)。
其次,即使它被扩展,你的例子也是有问题的,因为你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