我有一个关于Haskell中一些基本转换的问题。基本上,我有一个名为 Input.md 的书面输入文件。这包含在我的项目文件中读取的一些 markdown 文本,我想编写一些函数来对文本进行转换。在一个名为 convertToHTML 的函数下完成这些功能后,我将文件输出为正确格式的.html文件。
module Main
(
convertToHTML,
main
) where
import System.Environment (getArgs)
import System.IO
import Data.Char (toLower, toUpper)
process :: String -> String
process s = head $ lines s
convertToHTML :: String -> String
convertToHTML str = do
x <- str
if (x == '#')
then "<h1>"
else return x
--convertToHTML x = map toUpper x
main = do
args <- getArgs -- command line args
let (infile,outfile) = ((x:y:ys)->(x,y)) args
putStrLn $ "Input file: " ++ infile
putStrLn $ "Output file: " ++ outfile
contents <- readFile infile
writeFile outfile $ convertToHTML contents
所以
- 我将如何通读我的输入文件,并将任何以 # 开头的行转换为 html 标记
- 我将如何再次读取我的输入文件并将任何被
_word_
(1 个下划线(包围的 WORD 转换为另一个 html 标记 - 将任何字符替换为 html 字符串。
我尝试使用诸如Map,Filter,ZipWith之类的功能,但无法弄清楚如何遍历文本并转换每个文本。如果有人有任何建议,请。我已经连续工作了 2 天,并且有一堆失败的代码要显示几周,并且有一堆失败的代码来显示它。
我尝试使用诸如Map,Filter,ZipWith之类的功能,但无法弄清楚如何遍历文本并转换每个文本。
因为他们处理适当的元素集合。而且他们并没有真正"迭代";您只需要提供适当的数据即可。让我们以#
问题为例。
我们的文件是一个巨大的String
,我们希望将其很好地分成几行,所以[String]
.能为我们做什么?我不知道,所以让我们搜索 Hoogle 寻找String -> [String]
.
啊,我们开始了,lines
功能!它的对应物unlines
也将是有用的。现在我们可以编写我们的换行器:
convertHeader :: String -> String
convertHeader [] = [] -- that prevents us from calling head on an empty line
convertHeader x = if head x == '#' then "<h1>" ++ x ++ "</h1>"
else x
所以:
convertHeaders :: String -> String
convertHeaders = unlines . map convertHeader . lines
-- ^String ^[String] ^[String] ^String
如您所见,该函数首先将文件转换为行,在每行上映射convertHeader
,然后将文件重新组合在一起。
在 Ideone 上观看直播
现在尝试对words
执行相同的操作来替换格式模式。作为奖励练习,更改convertHeader
以计算行前的#
数并相应地输出<h1>
、<h2>
、<h3>
等。