問題:處理CSV文件並測試一個條件。當前代碼只是打印而不是測試條件。傳遞函數以處理CSV文件:鍵入錯誤
問題:類型推斷失敗。我不追蹤它爲什麼失敗。
下面是代碼,少了導入樣板。
--------------------------------------------------
has_empty_string :: [String] -> Bool
has_empty_string col =
any null col
----------------------------------------
get_hashrow :: [[String]] -> [String]
get_hashrow sheet =
-- looking at column 5
map (\row -> row !! 5) sheet
------------------------------
process_lines :: (String -> b) -> Handle -> IO()
process_lines func inh = do
ineof <- hIsEOF inh
if ineof
then return()
else do inpStr <- hGetLine inh
result <- func inpStr
putStrLn $ show result
process_lines func inh
------------------------------
process_lines_in_file :: (String -> b) -> FilePath -> IO()
process_lines_in_file func filename =
do inh <- openFile filename ReadMode
process_lines func inh
----------------------------------------
test_csv_row :: String -> Bool
test_csv_row row =
has_empty_string (get_hashrow (readCSV row))
----------------------------------------
main :: IO()
main = do
[filename] <- getArgs
process_lines_in_file test_csv_row filename
return()
而這裏的錯誤:
Couldn't match expected type `b' against inferred type `IO a'
`b' is a rigid type variable bound by
the type signature for `process_lines' at content-hash-p.hs:29:28
In a stmt of a 'do' expression: result <- func inpStr
In the expression:
do { inpStr <- hGetLine inh;
result <- func inpStr;
putStrLn $ show result;
process_lines func inh }
In the expression:
if ineof then
return()
else
do { inpStr <- hGetLine inh;
result <- func inpStr;
putStrLn $ show result;
.... }
「您可以選擇調用process_lines_in_file(返回。test_csv_row)filename或更改test_csv_row的實現以調用返回「或者,您可以用'let result = func inpStr'替換result < - func inpStr',相應地更改類型,然後傳遞'test_csv_row',其中可能會更有意義 – sepp2k
好吧,我沒有按照100%進行下一步操作,但這並不是你的錯。:-)'=>'實際上是什麼意思?我試着爲它找到一個參考,以及無法挖掘出一個好的描述,我找到了一個正式的語義符號 –
@Paul這是一個很大的問題,這取決於你對類型類的使用是多麼的舒適。教程將是一個合適的起點,例如http://learnyouahaskell.com/types-and-typeclasses或http://book.realworldhaskell.org/read/using-typeclasses.html或http://www.haskell。 org/tutorial/classes.html甚至全部三個複用。 –