【问题标题】: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)
      

      【讨论】:

        猜你喜欢
        • 2011-12-18
        • 2011-10-11
        • 2021-08-22
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        • 2018-04-23
        • 1970-01-01
        相关资源
        最近更新 更多