錯誤來自於read x
類型爲Double
而不是[Double]
,但是就其本身而言,即使使用該修補程序,您的功能也無法正常工作。
讓我們把你的函數放到單詞中:「把字符串列表的前面的元素作爲一個double來讀取,然後對列表的其餘部分做同樣的處理」。現在讓我們來看看你的功能:
stringToDouble :: [String] -> [Double]
stringToDouble [] = error "empty list"
stringToDouble [x] = read x :: Double -- Error
stringToDouble (x:xs) = stringToDouble xs
現在讓我們將修復應用到它。另外,沒有理由在空列表中出錯。只是產量和空的雙打名單:
stringToDouble :: [String] -> [Double]
stringToDouble [] = []
stringToDouble [x] = [read x :: Double] -- Put the single value into a list
stringToDouble (x:xs) = stringToDouble xs
問題在於遞歸步驟。在列表上調用stringToDouble
與在列表的尾部調用stringToDouble
相同。第一個元素簡單地被丟棄。您想要轉換頭並將其放回列表中。
stringToDouble :: [String] -> [Double]
stringToDouble [] = []
stringToDouble [x] = [read x :: Double] -- Put the single value into a list
stringToDouble (x:xs) = (read x :: Double) : stringToDouble xs
哪裏(:)
是用於將元件連接到列表中的正面的操作員。因此,甚至不需要中間線,因爲遞歸步驟將處理轉換,空列表步驟將處理停止條件。
stringToDouble :: [String] -> [Double]
stringToDouble [] = []
stringToDouble (x:xs) = (read x :: Double) : stringToDouble xs
現在,實事求是,你可以可能刪除:: Double
部分和Haskell會找出你的意思與功能的類型約束,但它不會傷害,有時它有助於可讀性離開它英寸
非常感謝您的支持。你有什麼建議,如果我有這樣的列表'[「a」,「1.2」]'..我怎樣才能使用數字而不是單詞,以便「a」會被忽略?通過正則表達式可能? – letsjak 2014-11-23 23:50:58
你是什麼意思「被忽略」?你想要發生什麼事情,非數字?你不能在Haskell中有一個異類列表,所以你不能有[「a」,1.2],因爲它沒有有效的類型。 – 2014-11-24 00:49:02
如果意圖忽略無法讀取的值,則定義'readMaybe x = {[(y,「」)] - >只是y; _ - > Nothing}'和'stringToDouble = catMaybes。地圖readMaybe' – user2407038 2014-11-24 01:12:16