输入范围haskell

输入范围haskell,haskell,input,io,main,Haskell,Input,Io,Main,我在接收输入时遇到问题。通过函数运行它。并输出它。我试着用两种不同的方法来做这件事,但都不管用。环顾四周,我看到每个人都只使用了main中输入的变量。这可以解释为什么我会得到一个不在范围内的错误。但这怎么可能呢?这是我的两次尝试 result = lcm 3 inp main = do inp <- getLine putStr result 这是: main = do inp <- getLine putStr result where

我在接收输入时遇到问题。通过函数运行它。并输出它。我试着用两种不同的方法来做这件事,但都不管用。环顾四周,我看到每个人都只使用了main中输入的变量。这可以解释为什么我会得到一个不在范围内的错误。但这怎么可能呢?这是我的两次尝试

result = lcm 3 inp

main = do
   inp <- getLine
   putStr result
这是:

main = do
   inp <- getLine
   putStr result
      where
      result = lcm 3 inp
inp只存在于do表达式的范围内,这解释了为什么在第一个版本中会出现错误

至于第二个版本。它可以重写为:

main = e
  where
    e = do
        inp <- getLine
        putStr result
    result = lcm 3 inp
结果现在在do符号范围内定义,所以它可以使用inp。如果仍要使用where子句,result将需要接受inp作为参数:

main = do
  inp <- getLine
  putStr result
  where     
    result inp = lcm 3 inp
inp只存在于do表达式的范围内,这解释了为什么在第一个版本中会出现错误

至于第二个版本。它可以重写为:

main = e
  where
    e = do
        inp <- getLine
        putStr result
    result = lcm 3 inp
结果现在在do符号范围内定义,所以它可以使用inp。如果仍要使用where子句,result将需要接受inp作为参数:

main = do
  inp <- getLine
  putStr result
  where     
    result inp = lcm 3 inp

让我们看看你使用的东西的类型:

*Main> :t lcm
lcm :: Integral a => a -> a -> a
*Main> let result inp = lcm 3 inp
*Main> :t result
result :: Integral a => a -> a
但是你读了一个字符串:

*Main> :t getLine
getLine :: IO String
因此,您需要将字符串转换为类似整数的值,并将结果转换为Inegral,然后返回String进行打印

main = do
    inp <- getLine
    putStr $ show $ result (read inp)

让我们看看你使用的东西的类型:

*Main> :t lcm
lcm :: Integral a => a -> a -> a
*Main> let result inp = lcm 3 inp
*Main> :t result
result :: Integral a => a -> a
但是你读了一个字符串:

*Main> :t getLine
getLine :: IO String
因此,您需要将字符串转换为类似整数的值,并将结果转换为Inegral,然后返回String进行打印

main = do
    inp <- getLine
    putStr $ show $ result (read inp)