Haskell Мутлиновый сторож внутри не работает - PullRequest
0 голосов
/ 25 марта 2020

Здравствуйте, я новичок в 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))

Что я знаю: внутри вы пишете «let» или «let» перед каждой объявленной функцией, а вы не пишете «in». Также, когда я писал вывод как нелокальную функцию, она работала.

Что я не так понял?

edit: вы бы порекомендовали написать так?

module Main where

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

1 Ответ

1 голос
/ 25 марта 2020

Вам нужно сделать отступ для охранников (по крайней мере, с одним дополнительным пробелом по сравнению с позицией output), например:

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

Поскольку число равно либо odd, либо even , вы можете просто использовать otherwise для случая even:

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