【问题标题】:Haskell mutliline guard inside do not workingHaskell mutliline 守卫内部不工作
【发布时间】:2020-03-26 01:16:09
【问题描述】:

您好,我是 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))

【问题讨论】:

  • 你应该缩进守卫,所以至少比output多一个空格。
  • 他们不是已经缩进了吗?它们比输出多 4 个空格
  • 不,现在它们处于let 级别,因此它们具有与output 相同的缩进。由于守卫“属于”output 函数,因此您需要比output 缩进更多。
  • 您上次的编辑没问题。如果您愿意,可以将let output i 放在第一行。如果你只在inp上使用output函数,你可以去掉i参数,直接使用inp。我强烈建议以otherwise 而不是even i 结尾。此外,在编译期间使用-Wall 打开警告。

标签: haskell io functional-programming guard


【解决方案1】:

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

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

由于数字是 oddeven,因此您可以将 otherwise 用于 even 案例:

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

【讨论】:

  • 完美!这是您推荐的写作方式吗?另外我想知道“否则”的情况永远不会发生,我可以在没有它的情况下运行代码,但这被认为是不好的做法吗?
  • @IlDeSanta:因为数字是oddeven,所以你可以使用otherwise 作为第二个守卫。
  • 是的,我拥有它,因为我希望代码易于阅读,尽管这里很明显。但总体而言,是否建议以始终正确的方式结束守卫?
  • @IlDaSanta:我个人更喜欢这样,因为这样可以保证每个输入都映射到输出(并且非全函数通常不是 ihmo 的好习惯)。
  • 如果守卫覆盖了空间但它不是很明显,我喜欢使用| otherwise = error "impossible"。我用这种方法发现了一些错误。您不仅希望每个输入都映射到任何输出,还希望得到正确的输出。
猜你喜欢
  • 2020-05-03
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 2012-03-15
相关资源
最近更新 更多