为啥这个变量在哪里不可见
Posted
技术标签:
【中文标题】为啥这个变量在哪里不可见【英文标题】:Why this variable is invisible in where为什么这个变量在哪里不可见 【发布时间】:2018-01-01 11:44:01 【问题描述】:我想从一个文本文件中读取一个矩阵[[Int]]
(这个矩阵在
project euler's problem),所以我有以下代码
parseInt :: String -> [Int]
parseInt [] = []
parseInt (x : xs) = [(ord x) - (ord '0')] ++ (parseInt xs)
main = do
str <- readFile "11.dat"
print $ fmap parseInt (lines str)
这段代码工作正常,我可以输出矩阵读取。
但是,我想更改 main
函数,这样我就可以重复使用 fmap parseInt (lines str)
而不是在我的代码中重复它。
main = do
str <- readFile "11.dat"
print b
where b = fmap parseInt (lines str)
编译器给我一个错误
11.hs:37:34: error:
Variable not in scope: str :: String
[Finished in 0.9s]
似乎是提要操作str <- readFile "11.dat"
导致了这个问题,因为当我直接从字符串中读取代码时,代码工作正常
main = do
print b
where b = fmap parseInt (lines "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08\n...01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48\n")
我也可以let
main = do
str <- readFile "11.dat"
let b = fmap parseInt (lines str)
print b
那么我该如何使用that
来做到这一点
【问题讨论】:
***.com/q/45306764/625403 最近被问到,这是实现以下 pigworker 答案中提供的相同实现的另一种方式。 【参考方案1】:这是一个解析问题。 Haskell 将有问题的代码解析为
main = (do str <- readFile "11.dat"; print b) where b = fmap parseInt (lines str)
因此,where
子句范围内的唯一局部变量是 =
左侧的模式变量(都没有,但通常,您可能有一些)。
同时,str
的范围仅从其绑定到 do
块的末尾。这就是为什么在绑定之后将let
放在do
块中就可以了。
【讨论】:
非常感谢您指出并纠正我的错误。根据您的建议,我进行了一些搜索,我发现this 可能也是一个不错的阅读材料 另一个常见的解决方法是将b
设为函数并将str
作为参数传递。以上是关于为啥这个变量在哪里不可见的主要内容,如果未能解决你的问题,请参考以下文章
keil编程中为啥总说我变量未定义? 不只是keil,C语言也经常有这种情况。根本不知道哪里错了
为啥在将 next.js 与环境变量一起使用时我的 API 密钥可见?