括号内的Haskell模式匹配
我想定义一个函数,该函数对特定类型的表达式进行操作,但可以访问其内部结构(如果有)。例如,f表示以下内容:括号内的Haskell模式匹配,haskell,pattern-matching,callbyname,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应该能够将其作为参数,但Haskell无法解析上面f的定义。我想定义一些类似于f的东西来利用按名称调用的计算。在Haskell中有什么方法可以做到这一点吗?首先,模式匹配只允许在模式上进行,即从应用程序、构造
g :: a -> a -> a
g x y = y
f :: a -> a
f x'@(g x y) = x'
f _ = 1
(g x y)的类型为a,因此f应该能够将其作为参数,但Haskell无法解析上面f的定义。我想定义一些类似于f的东西来利用按名称调用的计算。在Haskell中有什么方法可以做到这一点吗?首先,模式匹配只允许在模式上进行,即从应用程序、构造函数和变量构建的表达式(最多使用一次) 第二,即使对其进行了扩展,您的示例也是有问题的,因为您的
g
不是内射的:
case g x y of g a b -> a
应等于,因为gxy=y
case y of g a b -> a
但是a
可以是任何东西
相反,如果g
是由一个可能是模式的表达式定义的,那么如果您通过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
你不能这么做,因为类型系统不允许这样做。但我不在乎!Haskell是懒惰的,除非显式需要,否则不会计算参数,因此默认情况下它有点“按名称调用”。
g
不是构造函数,因此无法对其进行模式匹配。你到底想做什么?