簡體   English   中英

無法將類型“IO 字符串”與“[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 Stringlines :: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM