2017-07-26 95 views
2

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

+0

https://stackoverflow.com/q/45306764/625403最近被问到,这是另一种方式来实现下面的pigworker的答案中提供的相同的实现。 – amalloy

回答

4

这是一个解析问题。哈斯克尔解析有问题的代码

main = (do {str <- readFile "11.dat"; print b}) where {b = fmap parseInt (lines str)} 

,这样的范围只有局部变量为where条款是模式变量的=左侧(全部没有人,但在一般情况下,你可能有一些)。

同时str范围仅从其绑定到do块的末尾。这就是为什么在块中放置一个let后,该绑定工作得很好。

+0

非常感谢您指出并纠正我的错误。遵循你的建议,我做了一些搜索,并且我发现[this](https://stackoverflow.com/questions/8274650/in-haskell-when-do-we-use-in-with-let)也许是一个好东西阅读 – calvin

+0

另一个常见的问题是使'b'成为函数并将'str'作为参数传递给它。 –

相关问题