作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
<分区>
我正在用 Haskell 编写一个程序,它是 IO,当我遇到一个我不明白的错误时。当我在 do block 之后使用 where 语句时,它不会做与没有 do block 相同的事情。
有效的程序是:
import Control.Monad
prog :: IO()
prog = do m <- getLine
n <- getLine
p <- getLine
replicateM_ (read m :: Int) (putStrLn n)
replicateM_ (read m :: Int) (putStrLn p)
但是当我用这样的 where 语句替换 read m::Int
时:
import Control.Monad
prog1 :: IO()
prog1 = do m <- getLine
n <- getLine
p <- getLine
replicateM_ (a) (putStrLn n)
replicateM_ (a) (putStrLn p)
where
a = read m :: Int
我得到错误:
Template.hs:23:21: error: Variable not in scope: m :: String
|
23 | a = read m :: Int
| ^
我查看了问题所在,我认为这与 m 的类型有关,即 IO String
。我知道你必须留在 IO 类型中(一旦你在其中)才能使用字符串。但是我不明白为什么这种IO类型的'where'会“爆发”。据我了解,我给出的两个示例在功能上是相同的。首先,我认为编写没有 where 的程序不会修复错误,因为读取的函数来自 read::Read a => String -> a
类型,而我在第一个程序也是 IO String
。那么为什么我的第一个程序没有报错呢?有人能解释一下我理解错了什么以及如何修复我的程序以便我只需要执行一次 read m::Int
吗?关于如何在 do block 下使用 where 语句的一些提示也会有所帮助。
我遇到问题的原始程序更长,而且不是所有相关的,所以我使用这个最小的工作示例来解释我的问题的本质。在我原来的程序中,我在 where 之后有多个语句,所以我不想像我在这个例子中所做的那样全部替换它。
我是一名优秀的程序员,十分优秀!