【发布时间】:2014-08-13 21:12:41
【问题描述】:
我正在尝试编写一个从基于文本的输入文件生成 Latex 代码的 Haskell 程序。为此,我想使用HaTeX。
作为第一步,我想为存储在文本文件中的电影生成指向 IMDB 的链接。格式为每行一部电影,标题和 IMDB URL 由 | 分隔。人物:
Movie 1 | http://url1
Movie 2 | http://url2
我目前的代码如下:
import System.IO
import Data.Char(toUpper)
import Data.List.Split(splitOn)
import Text.LaTeX.Packages.Hyperref
import Text.LaTeX
main :: IO()
main = execLaTeXT generateFromFile >>= renderFile "output.txt"
generateFromFile :: Monad m => LaTeXT_ m
generateFromFile = do
m <- getMovies -- AFAIK this should "bind" the IO Monad, i.e. m should be [[String]]
(generateFromStrLists m)
-- Takes a list of lists of strings and generates links
generateFromStrLists :: Monad m => [[String]] -> LaTeXT_ m
generateFromStrLists [] = fromString ""
generateFromStrLists (y:x) = do
(generate u t)
(generateFromStrLists x)
where
u = y !! 0
t = y !! 1
-- Generate the movie link for a given title and URL
generate :: Monad m => String -> String -> LaTeXT_ m
generate u t = (href [] (createURL u) (fromString t))
getMovies :: IO [[String]]
getMovies = do
lines <- getLines "movies.lst" -- [String]
return $ map (splitOn "|") lines
getLines :: FilePath -> IO [String]
getLines filename = do
text <- readFile filename
return $ lines text
如果我使用手工制作的 [[String]] 手动调用 generateFromStrLists,则输出会正确生成。
我猜我看到的问题与 Monads 有关(但我不确定)。我猜我 1) 要么不充分理解 IO Monad,要么 2) 混淆了使用 IO Monad 和 Monad 来正确生成 Latex 代码(可能在 generateFromStrLists 中)。
【问题讨论】: