【问题标题】:Is there a multiple-condition if in Haskell?如果在 Haskell 中有多重条件吗?
【发布时间】:2023-03-08 06:38:01
【问题描述】:

我试图嵌套检查两个以上条件的守卫,如下所示:

f :: Int -> Int
f i
   | bool1
       | bool2 = a
       | bool3 = a2
       | otherwise = a3
   | bool4
       | bool5 = a4
       | bool6 = a5
       | otherwise = a6
   | bool8
...
   | otherwise = an


这给了我一个解析错误。 这是正确的方法吗
用 && or 压平警卫
实现这样的功能:

multiIf :: [Bool] -> [a] -> a
multiIf (x:xs) (l:ls) = if x then l else multiIf xs ls
multiIf _ _ = undefined

或者有其他方法吗?

【问题讨论】:

  • 试试 MultiWayIf 扩展。
  • 这是否意味着如果bool7 为假,则再次考虑外部分支并评估bool8,等等?你的multiIf 不会那样做,AFAICS。
  • @chi 谢谢,我本来打算用别的方式
  • 虽然我承认它不是特别好,但如果你真的需要编写这种函数,那么我可能会制作一个大的 if/then/else 树,并带有适当的缩进。
  • @RobinZigmond 次要观点:从技术上讲,if 不需要任何缩进(但实际上在没有适当缩进的情况下编写大型嵌套if 会导致代码不可读,因此仍然强烈推荐)。跨度>

标签: if-statement haskell


【解决方案1】:

不是直接的,但是the MultiWayIf extension 可以给你一个非常相似的风格。

{-# LANGUAGE MultiWayIf #-}

f :: Int -> Int
f i
   | bool1
       = if | bool2 -> a
            | bool3 -> a2
            | otherwise -> a3
   | bool4
       = if | bool5 -> a4
            | bool6 -> a5
            | otherwise -> a6
   | bool8
...
   | otherwise = an

【讨论】:

    猜你喜欢
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多