我试图了解GHC中视图模式和模式保护之间的关系。模式防护似乎非常直观,而视图模式似乎有点令人困惑。有点看起来模式对于处理模式中的深层事物看起来更好,而模式保护可以更直观地重用视图,但我不太明白。
答案 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
...
在处理更复杂的视图方面有一点点糖,但基本上就是这样。另一方面,图案防护更严格,
当我做“透镜般”的事情时,我更喜欢观看模式。我有一大块数据,我对它的一个特定观点感兴趣。例如,带镜头
foo (view someLens -> Bar baz quux) = ...
当你想要更接近更灵活的案例表达时,模式守卫往往会运作良好。