2014-02-25 130 views
0

編輯:添加的新代碼和新的錯誤也改變了。它編譯!Haskell逐行打印文件

我是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

請使用類型簽名。它至少會使第一個錯誤消息更加混亂,並且代碼變得更加可讀。 – leftaroundabout

+0

我已經添加了一個類型簽名並更新了代碼! :) – user3290526

+0

@ user3290526:文件結構如何?每一行都有一個單詞? – Zeta

回答

2

由於您在連接中使用n,因此GHC假定n[Char]。但是,您希望nInt或類似的東西,只要您想將其轉換爲String,就可以使用show n

另一個錯誤與group的返回有關。由於group只是printSplit與一些固定參數,它具有相同的返回類型,即[String][[Char]]。但是,putStrLn需要單個字符串。您可以使用unlinesconcat來連接您的字符串。

+0

我已經更新了代碼,並明白你的意思。我已經改變了實現,但是你可以試着幫我弄清楚這兩個錯誤嗎? :) – user3290526