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