我发现我不知道如何处理Haskell中if-else-then
个块中的嵌套do
。
我已经知道我可以使用case
,但这需要我的所有条件(a
,b
和c
)返回相同的类型({ {1}},所以只有两种情况,但我需要三种不同的情况),因此不那么一般(如果我错了,请纠正我)。我也尝试过在这里考虑使用防护,但我不知道如何在Bool
语句中执行此操作,特别是如果do
表达式的类型为-- something
。
假设我在IO ()
内有以下代码:
do
如何创建等效逻辑但没有所有缩进?
答案 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?