繁体   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