为什么这个变量在哪里是不可见的

时间:2017-07-26 08:56:34

标签: haskell monads

我想从文本文件中读取矩阵[[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]

似乎Feed操作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

来做到这一点

1 个答案:

答案 0 :(得分:4)

这是一个解析问题。 Haskell将违规代码解析为

sudo systemkeychain -vfcC [password]

因此main = (do {str <- readFile "11.dat"; print b}) where {b = fmap parseInt (lines str)} 子句范围内唯一的局部变量是where左侧的模式变量(所有这些都不是,但一般来说,你可能有一些)。

同时=范围仅限于其绑定到str块的末尾。这就是为什么在绑定之后将do放在let块中的原因就好了。