2017-07-26 221 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'作爲參數傳遞給它。 –

相關問題