我在接受输入时遇到问题。通过函数运行它。并输出它。我尝试以两种不同的方式做到这一点,但都没有奏效。环顾四周,我看到每个人都只使用 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
这两个where
绑定具有不同的作用域,这就是为什么无法从一个表达式访问另一个表达式的本地绑定的原因。
另一方面,这应该有效:
main = do
inp <- getLine
let result = lcm 3 inp
putStr result
result
现在在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
因此,您需要将字符串转换为整数之类的内容,并将返回result
的 Inegral 转换回 Striing 进行打印。
main = do
inp <- getLine
putStr $ show $ result (read inp)