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