编辑:添加了新代码,新错误也发生了变化。它编译!
我是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来尝试这些函数呢? :)
答案 0 :(得分:2)
由于您在串联中使用n
,因此GHC假定n
是[Char]
。但是,您希望n
为Int
或类似内容,并且只要您想将其转换为show n
,就可以使用String
。
另一个错误与group
的返回有关。由于group
仅包含printSplit
个固定参数,因此它具有相同的返回类型,即[String]
或[[Char]]
。但是,putStrLn
需要一个String。您可以使用unlines
或concat
来连接字符串。