Haskell 内部的多线防护不工作

Haskell mutliline guard inside do not working

你好,我是 Haskell 的新手,我认为我的问题很简单,但对我来说很重要。

这个有效:

module Main where

main :: IO ()
main = do
    inp <- getLine
    let output i | odd i = "Alice" | even i = "Bob" | otherwise = "Weird"
    putStrLn (output (read inp))

这行不通

module Main where

main :: IO ()
main = do
    inp <- getLine
    let output i 
        | odd i = "Alice" 
        | even i = "Bob" 
        | otherwise = "Weird"
    putStrLn (output (read inp))

我所知道的: 在你声明的每个函数之前,你在里面写 "lets" 或 "let" 而你不写 "in"。此外,当我将输出写为非本地函数时,它也起作用了。

我误解了什么?

编辑: 你会推荐这样写吗?

module Main where

main :: IO ()
main = do
    inp <- getLine
    let
        output i 
            | odd i = "Alice" 
            | even i = "Bob"
    putStrLn (output (read inp))

你需要将守卫缩进(与output的位置相比至少多一个space),例如:

main :: IO ()
main = do
    inp <- getLine
    let output i 
            | odd i = "Alice" 
            | even i = "Bob" 
            | otherwise = "Weird"
    putStrLn (output (read inp))

由于数字是 oddeven,对于 even 的情况,您可以只使用 otherwise

main :: IO ()
main = do
    inp <- getLine
    let output i 
            | odd i = "Alice" 
            | <b>otherwise</b> = "Bob"
    putStrLn (output (read inp))