我有一个关于Haskell中一些基本转换的问题。 基本上,我有一个名为Input.md的书面输入文件。这包含一些在我的项目文件中读取的降价文本,我想写一些函数来对文本进行转换。在一个名为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
所以,
_word_
(1下划线)包围的任何WORD转换为另一个html标记我尝试使用Map,Filter,ZipWith等功能,但无法弄清楚如何迭代文本并转换每个文本。如果有人有任何建议,请。我已经连续工作了两天,并且有一堆失败的代码要显示几周并且有一堆失败的代码来显示它。
答案 0 :(得分:0)
我尝试使用Map,Filter,ZipWith等函数,但无法弄清楚如何遍历文本并转换每个文本。
因为它们适用于适当的元素集合。他们并没有真正“迭代”;你只需要提供适当的数据。我们来解决#
问题。
我们的文件是一个巨人String
,我们想要的是将它很好地分成几行,所以[String]
。有什么能为我们做的?我不知道,所以我只是search Hoogle for 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
,然后将文件重新组合在一起。
现在尝试使用words
执行相同操作以替换格式设置模式。作为奖励练习,请更改convertHeader
以计算该行前面#
的数量,并相应地输出<h1>
,<h2>
,<h3>
等。