我想了解一个使用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
...
为什么_
是必需的,为什么作者能够在其中使用防护装置?
答案 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 ...
,以强调其价值无关紧要。