2017-04-23 151 views
4

我嘗試解析haskell中的命令行參數。解析命令行參數

下面是一個示例代碼:

import System.Environment 

work :: [Integer] -> Int 
work (s:r:t:es) = length es 

main :: IO() 
main = getArgs >>= putStrLn . show . work . (map read) 

我與執行它:

./test 2 10 10 [7, 3, 5, 4, 4] 

輸出是5像預期。 但是如果我更換之和Int長度整數執行引發錯誤

test: Prelude.read: no parse 

有人能解釋如何做到這一點?

回答

6

getArgs返回的列表如下所示:["2", "10", "10", "[7,", "3,", "5,", "4,", "4]"]。前三個字符串是整數的有效字符串表示,但其他字符串不是。所以當你對這些使用read時,你會得到一個錯誤。

當您計算長度時看不到錯誤的原因是length不必查看列表中的值,因此從不評估read

但是,爲了總結這些值,他們肯定需要評估。所以這就是爲什麼你會得到一個例外。

爲了解決您的問題,您可以將參數的格式更改爲不包含括號和逗號,也可以在將參數傳遞給read之前手動檢查參數並刪除括號和逗號。

另一種方法是將後面的參數連接在一起,用空格分隔(所以最後以「[7,3,5,4,4]」結尾),然後將其作爲單個字符串傳遞給read請輸入[Integer]