查看模式和。模式守卫

时间:2013-12-24 21:17:46

标签: haskell pattern-matching

我试图了解GHC中视图模式和模式保护之间的关系。模式防护似乎非常直观,而视图模式似乎有点令人困惑。有点看起来模式对于处理模式中的深层事物看起来更好,而模式保护可以更直观地重用视图,但我不太明白。

2 个答案:

答案 0 :(得分:12)

视图模式与模式保护显着重叠。视图模式的主要优点是它们可以嵌套,并避免引入中间模式变量。对于一个愚蠢的例子:

endpoints (sort -> begin : (reverse -> end : _)) = Just (begin, end)
endpoints _ = Nothing

模式保护等价物要求每个新视图绑定一个新的模式变量,在评估表达式和绑定模式之间交替。

endpoints xs
  | begin : sorted <- sort xs
  , end : _ <- reverse sorted
  = Just (begin, end)
  | otherwise = Nothing

视图模式也可以仅使用模式中较早绑定的那些变量,但看起来确实很好:

nonzero :: (a -> Int) -> a -> Maybe a
nonzero f (f -> 0) = Nothing
nonzero _ x = Just x

-- nonzero (fromEnum . not . null) "123" == Just "123"
--                                 ""    == Nothing

模式防护的主要优点是它们是一种简单的防护概括,并且可以包含普通的布尔表达式。我通常更喜欢它们而不是视图模式,因为我发现case的样式和守护的重复程度低于等式样式。

答案 1 :(得分:7)

视图模式允许您在模式匹配之前投影值。它几乎可以被认为是

的捷径
 foo x = case f x of
   ...

在处理更复杂的视图方面有一点点糖,但基本上就是这样。另一方面,图案防护更严格,

  1. 它们可以包含用于匹配的任意布尔条件
  2. 他们可以使用多个变量匹配
  3. 当我做“透镜般”的事情时,我更喜欢观看模式。我有一大块数据,我对它的一个特定观点感兴趣。例如,带镜头

    foo (view someLens -> Bar baz quux) = ...
    

    当你想要更接近更灵活的案例表达时,模式守卫往往会运作良好。