【问题标题】:Scope of input haskell输入haskell的范围
【发布时间】:2015-01-19 10:43:36
【问题描述】:
我在输入输入时遇到问题。通过函数运行它。并输出它。我试图以两种不同的方式做到这一点,但都没有奏效。在网上环顾四周,我看到每个人都只使用 main 中的输入变量。这可以解释为什么我收到“不在范围内”错误。但这怎么可能呢?这是我的两次尝试。
result = lcm 3 inp
main = do
inp <- getLine
putStr result
还有这个:
main = do
inp <- getLine
putStr result
where
result = lcm 3 inp
【问题讨论】:
标签:
haskell
input
io
main
【解决方案1】:
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
【解决方案2】:
让我们看看你使用的东西的类型:
*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
因此,您需要将 String 转换为整数之类的东西,并将 Inegral 返回的 result 转换回 String 以进行打印。
main = do
inp <- getLine
putStr $ show $ result (read inp)