2017-01-15 89 views
0

我正在开发一个类似简单excel的haskell中的小项目。基本上我的电子表格表示为列表清单(类型为[[String]])。示例板如下所示:如何将转换为字符串值的[[String]]转换回原始类型[[String]]?

[["2", "=SUM(A0:C0)", "1"], ["7", "2", "3"], ["2", "=SUM(A0:B0)", ""]] 

其中一个要求是将文件保存在文件中,并且还可以从文件中导入文件。

要保存的文件,我的板转换为字符串(能够把它写在文件中):

filenameOut <- getLine 
writeFile filenameOut (show (board)) 
putStrLn "Board saved to file." 

要上载板:

filenameIn <- getLine 
handle <- openFile filenameIn ReadMode 
input <- hGetContents handle 

但输入字符串“[[”2“,”= SUM(A0:C0)“,”1“],[”7“,”2“,”3“],[”2“,”= SUM(A0:B0 )“,”“]]”,我想将它转换回[[String]]。 我试图使用正则表达式,但它似乎不是一个好的解决方案。

是否有一些其他的解决方案来做某种逆操作来返回[[String]]? 请温柔一点,我是哈斯克尔的新人。

+0

我对字符串'“[[” 2" ,“= SUM(A0很困惑: C0)“,”1“,[”7“,”2“,”3“],[”2“,”= SUM(A0:B0)“,”“]]]''。这似乎是无效的。 –

+0

@ eli-sadoff,是的,我只是想表明这是一个字符串。在文件中它看起来像:[[“2”,“= SUM(A0:C0)”,“1”],[“7”,“2”,“3”],[“2”,“= SUM (A0:B0)“,”“]]。当我按照我提出的方式从文件上传它时,它是String类型的。 – rocksparrow

+1

您正在查找的术语是读取或“解析”字符串。查看文本以获取结构化值的过程通常称为解析。我们可以获得更多的技术和讨论lexing,但是如果你寻找CSV解析器或者只是'read'函数,那么你会好起来的。 –

回答

2

查看Read typeclass的前奏。

read :: (Read a) => String -> a是一个部分函数,​​它尝试从输入字符串中解析类型为a的值。并非所有类型都有Read实例,但是对于那些实例,对于任何val :: A,则read (show val) :: A将返回val;换句话说,readshow的倒数。

使用read有点棘手,因为一般来说,编译器将无法知道你想要的输出类型。如果你听到呻吟GHC关于“暧昧型”你应该注释结果read,像这样:

read "[[\"1\", \"hello\"], []" :: [[String]] 
相关问题