输入范围哈斯克尔



我在接受输入时遇到问题。通过函数运行它。并输出它。我尝试以两种不同的方式做到这一点,但都没有奏效。环顾四周,我看到每个人都只使用 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)

相关内容

  • 没有找到相关文章

最新更新