从case语句中获取数据对象

时间:2017-10-24 17:22:21

标签: haskell

假设我有:

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模式匹配而不必再次使用函数定义中的构造函数?

1 个答案:

答案 0 :(得分:9)

是的,您可以使用as pattern @

exampleFunc :: Z -> IO ()
exampleFunc x@(A a b c d) = someOtherFunc x

此外,通过使用记录语法,您甚至可以完全省略头部中的abcd参数。功能:

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 yetAnotherFunctionA构造函数的参数不感兴趣。