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))
由于数字是 odd
或 even
,对于 even
的情况,您可以只使用 otherwise
:
main :: IO ()
main = do
inp <- getLine
let output i
| odd i = "Alice"
| <b>otherwise</b> = "Bob"
putStrLn (output (read inp))
你好,我是 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))
由于数字是 odd
或 even
,对于 even
的情况,您可以只使用 otherwise
:
main :: IO ()
main = do
inp <- getLine
let output i
| odd i = "Alice"
| <b>otherwise</b> = "Bob"
putStrLn (output (read inp))