![](/img/trans.png)
[英]Haskell Couldn't match expected type 'String' with actual type 'Char'
[英]Couldn't match type ‘IO String’ with ‘[Char]’
我有一個項目要為學校做,我需要從文件中讀取,並獲得我必須實現的功能的負責人。
我已經給出了以下函數,我假設它讀取名稱為“file_name”的文件:
getInputTest file_name = do
x <- readFile file_name
return x
接下來,我必須解析文本的每一行,以獲得字符串向量,向量的每個元素都是文件的一行。 這是我給我必須實現的功能的負責人的地方:
parse :: String -> [Instr]
這個函數的第一個參數應該是從文件中讀取的所有內容(所有行),[Instr] 應該由文件中的所有行組成,向量的每個元素都是一行。(“Instr”應該由我選擇,我嘗試選擇它“字符串”,但它不起作用)
我已經試過了:
parse file_name = lines (getInputTest file_name)
但我不斷收到錯誤,例如:“無法將類型 'IO String' 與 '[Char]' 匹配”。
我做錯了什么,我該如何解決? 考慮到不應修改“解析”函數的頭部。
String
是[Char]
,所以編譯器抱怨它被包裹在IO
。 閱讀例如。 https://wiki.haskell.org/Introduction_to_IO的解釋。
要修復它,您需要在其調用點“提升”解析函數以對IO String
進行操作。 這通常需要例如。 fmap / <$>
,但在內部使用do
notation 然后它可以通過編寫例如。 return $ parse x
。
getInputTest file_name = do x <- readFile file_name return x
這等效於以下任何一項:
getInputTest :: FilePath -> IO String
getInputTest fileName = readFile fileName >>= \x -> return x
getInputTest fileName = readFile fileName >>= return
getInputTest fileName = readFile fileName
getInputTest = readFile
parse :: String -> [Instr] parse file_name = lines (getInputTest file_name)
由於getInputTest :: FilePath -> IO String
和lines :: String -> [String]
,你必須作為一個泰勒說,電梯lines
,使得它在上下文IO
。
執行fmap lines
您會得到Functor f => f String -> f [String]
類型,當將f
專門化為IO
,它會變成IO String -> IO [String]
。 這與readFile
的輸出類型匹配,因此函數可以組成:
parse :: FilePath -> IO [String]
parse fileName = fmap lines (getInputTest fileName)
我不知道是什么樣類型的Instr
是,如果有進一步的解析比lines
確實把一個String
線成Instr
; 如果沒有,也許您可以將這兩個功能合二為一:
type Instr = String
fromFile :: FilePath -> IO [Instr]
fromFile = fmap lines . readFile
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.