Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
括号内的Haskell模式匹配_Haskell_Pattern Matching_Callbyname - Fatal编程技术网

括号内的Haskell模式匹配

括号内的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中有什么方法可以做到这一点吗?首先,模式匹配只允许在模式上进行,即从应用程序、构造

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

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
不是构造函数,因此无法对其进行模式匹配。你到底想做什么?