在Haskell的do块中处理嵌套的if-else-then

时间:2019-04-23 04:07:45

标签: haskell

我发现我不知道如何处理Haskell中if-else-then个块中的嵌套do

我已经知道我可以使用case,但这需要我的所有条件(abc)返回相同的类型({ {1}},所以只有两种情况,但我需要三种不同的情况),因此不那么一般(如果我错了,请纠正我)。我也尝试过在这里考虑使用防护,但我不知道如何在Bool语句中执行此操作,特别是如果do表达式的类型为-- something

假设我在IO ()内有以下代码:

do

如何创建等效逻辑但没有所有缩进?

1 个答案:

答案 0 :(得分:9)

首先,值得注意的是if表达式实际上并不需要额外的缩进(if-within-do曾经是一个例外,但Haskell 2010消除了这种情况)。这意味着您可能会折叠所有多余的缩进:

test = do
    len <- length <$> getLine
    if len < 4
    then putStrLn "Short"
    else if len > 6
    then putStrLn "Long"
    else putStrLn "Mid"

但是,就我个人而言,我觉得美学上并不太令人满意,因为我觉得有些缩进使if表达式更易于理解。一个不错的选择是使用the MultiWayIf extension

{-# LANGUAGE MultiWayIf #-}

test = do
    len <- length <$> getLine
    if | len < 4 -> putStrLn "Short"
       | len > 6 -> putStrLn "Long"
       | otherwise -> putStrLn "Mid"

最后一点,嵌套的if表达式变得笨拙可能会是一个很好的时机,可以将其分解为单独的定义,或者以其他方式重新组织代码。另请参阅:How do I deal with many levels of indentation?