首页 > 解决方案 > Haskell mutliline 守卫内部不工作

问题描述

您好,我是 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”。此外,当我将输出编写为非本地函数时,它也起作用了。

我误解了什么?

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

module Main where

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

标签: haskelliofunctional-programmingguard

解决方案


您需要缩进警卫(与 的位置相比至少有一个额外的空间output),例如:

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

由于数字是oddor even,因此您可以只使用otherwise这种even情况:

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

推荐阅读