Haskell逐行打印文件

时间:2014-02-25 23:43:11

标签: file haskell printing

编辑:添加了新代码,新错误也发生了变化。它编译!

我是Haskell的新手,并且我正在尝试创建用于从文本文件中打印行的代码中遇到问题。在这样做时,我需要文件的输出逐个列出行并对它们进行编号,并在不以相同字符开头的行之间放置一行破折号。以下是我想要的输出示例:

$runghc group.hs (file I input)
1 able
2 academia
3 algae
------
4 carton
------
5 fairway
------
6 hex
7 hockshop

这是我目前的代码。我想我正朝着正确的方向前进,但我遇到了一些错误。

import System.Environment (getArgs)

group :: [Char] -> [Char]
group file = printSplit (words (show file)) 1

printSplit (x:[]) n = show n ++ x 
printSplit (x:t) n
       | head x == head (head t) = ((show n) ++ x) ++ printSplit t (n+1)
       | otherwise = ((show n) ++ x ++ "\n------") ++ printSplit t (n+1)

main = do
 args <- getArgs
 bytes <- readFile (head args)
 putStrLn (group bytes)

我遇到了这个错误:

*Main> main
1"able\nacademia\nalgae\ncarton\nfairway\nhex\nhockshop\n"

还不知道怎么做...


原始帖子信息:我正在尝试的另一种方式是做单词(显示文件),它会给我

["able","academia","algae","carton","fairway","hex","hockshop"]

但我不知道在那之后会去哪里。既然我正在尝试学习高阶函数,也许有人可以解释一下如何使用map或fold来尝试这些函数呢? :)

1 个答案:

答案 0 :(得分:2)

由于您在串联中使用n,因此GHC假定n[Char]。但是,您希望nInt或类似内容,并且只要您想将其转换为show n,就可以使用String

另一个错误与group的返回有关。由于group仅包含printSplit个固定参数,因此它具有相同的返回类型,即[String][[Char]]。但是,putStrLn需要一个String。您可以使用unlinesconcat来连接字符串。