Jiv*_*van 3 haskell pattern-matching
使用这样的case _ of
语法:
fun a b c =
case (a, b, c) of
(Just True, Just _, _) -> foo
(Just True, _, Just _) -> foo
_ -> bar
Run Code Online (Sandbox Code Playgroud)
我可以合并前两个条件并避免重复foo
吗?
或者,有没有其他(更干净的)方式来表达我想运行foo
当且仅当a
isJust True
和b
or or c
not Nothing
?
Dan*_*ner 11
你可以这样做:
fun a b c = case (a, b <|> c) of
(Just True, Just _) -> foo
_ -> bar
Run Code Online (Sandbox Code Playgroud)
当然,这只是将额外的匹配隐藏在 中(<|>)
,但您必须向吹笛者支付一些时间。
如果b
和c
不具有相同的类型,您可以使它们与名称错误的void
.
让我用一个“无聊”的选择来补充其他答案:
fun a b c = let
foo' = foo
in case (a, b, c) of
(Just True, Just _, _) -> foo'
(Just True, _, Just _) -> foo'
_ -> bar
Run Code Online (Sandbox Code Playgroud)
这可能会也可能不会回答预期的问题,具体取决于实际目标。
如果目标是避免在 中写入两个模式case
,这当然达不到目标。
相反,如果目标是避免重复foo
,这可能是一个很长的表达式(例如,do
某些 monad 中的长块),则通过为长表达式指定一个短名称来满足目标。
归档时间: |
|
查看次数: |
110 次 |
最近记录: |