假设我有:
data Z = A Int Int Int Int | B String | Char
exampleFunc :: Z -> IO ()
exampleFunc (A a b c d) = someOtherFunc (A a b c d)
有没有办法传递A模式匹配而不必再次使用函数定义中的构造函数?
答案 0 :(得分:9)
是的,您可以使用as pattern @
:
exampleFunc :: Z -> IO ()
exampleFunc x@(A a b c d) = someOtherFunc x
此外,通过使用记录语法,您甚至可以完全省略头部中的a
,b
,c
和d
参数。功能:
exampleFunc :: Z -> IO ()
exampleFunc x@A{} = someOtherFunc x
这是上述代码片段的缩写,但无需指定参数。例如,如果您稍后计划更改参数数量,并且您希望防止必须更改仅依赖于构造函数类型(而不是参数)的所有函数定义,那么这将非常有用。如果您只对参数的子集感兴趣,Record pattern也很有用。
由于模式可以递归使用(模式作为构造函数的参数),因此您也可以递归使用as模式。例如:
yetAnotherFunction :: Maybe Z -> IO ()
yetAnotherFunction x@(Just y@A{}) = -- ...
所以在这里我们获得对Just (A a b c d)
对象以及A a b c d
对象的引用。 Apparentely yetAnotherFunction
对A
构造函数的参数不感兴趣。