![](/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.