2014-11-21 78 views
1

我在输入时遇到了问题。通过函数运行它。并输出它。我试图用两种不同的方式做到这一点,但都没有成功。在网上查看我看到每个人只使用主输入内的变量。这可以解释为什么我得到一个“不在范围内”的错误。但这怎么可能呢?这是我的两次尝试。输入范围haskell

result = lcm 3 inp 

main = do 
    inp <- getLine 
    putStr result 

这:

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

回答

4

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 
0

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

*Main> :t lcm 
lcm :: Integral a => a -> a -> a 
*Main> let result inp = lcm 3 inp 
*Main> :t result 
result :: Integral a => a -> a 

但你在一个String读:

*Main> :t getLine 
getLine :: IO String 

所以,你需要一个字符串转换为类似一个整数,并将其转换的Inegral的result返回到Striing进行打印。

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