通配符模式匹配在case表达式中如何工作?

时间:2018-07-10 22:05:40

标签: haskell

我想了解一个使用example server code库的WebSocket

我发现了一个奇怪的case表达式,我无法理解:

case msg of
    _   | not (prefix `T.isPrefixOf` msg) ->
            WS.sendTextData conn ("Wrong announcement" :: Text)

        | any ($ fst client)
            [T.null, T.any isPunctuation, T.any isSpace] ->
                WS.sendTextData conn ("Name cannot " `mappend`
                    "contain punctuation or whitespace, and " `mappend`
                    "cannot be empty" :: Text)

        | clientExists client clients ->
            WS.sendTextData conn ("User already exists" :: Text)

        | otherwise -> flip finally disconnect $ do

        -- ...

通配符在这里是什么意思? case表达式的语法是这样的:

case expression of pattern -> result  
                   pattern -> result  
                   pattern -> result  
                   ...  

为什么_是必需的,为什么作者能够在其中使用防护装置?

1 个答案:

答案 0 :(得分:7)

case irrelevant of
   _ | condition1 -> e1
     | condition2 -> e2
     ...
     | otherwise  -> eO

是写if then else链的一种好方法。

if condition1 
then e1
else if condition2
then e2
...
else eO

irrelevant表达式无关。它的值与_匹配,后者总是成功并丢弃该值。

您的代码令人困惑地使用case msg of ...,但是msg被忽略。通常会这样写case () of ...,以强调其价值无关紧要。