2009-11-18 15 views
6

Selam. Bir öğretici bu hafta için, sorulardan biri hatlarının listesini biçimlendirmek için diğer işlevleri formatLine ve formatList kullanarak bir fonksiyon formatLines oluşturmak ister.New Line Haskell

Benim kod şöyle görünür;

type Line = String 

formatLine :: Line -> String 
formatLine l = l ++ "\n" 

formatList :: (a -> String) -> [a] -> String 
formatList f [] = [] 
formatList f xs = f (head xs) ++ formatList f (tail xs) 

formatLines :: [Line] -> String 
formatLines xs = formatList formatLine xs 

kodu (bana, en azından) bunun gibi çalışması gerekir, ancak bunun yerine "\ n" olan yeni bir çizgi yaratmak gibi görünüyor, \ n dize eklenen alır.

Herhangi bir yardım büyük memnuniyetle karşılanacaktır. muhtemelen sonucu yazdırmak için print kullanıyor çünkü

+2

'formatList = map' deneyin: sırayla eşdeğerdir

formatLines :: [String] -> String formatLines = concatMap (++ "\n") 

... unlines için – Chuck

cevap

21

. Bunun yerine, putStr kullanın. Gözlemleyin: Bundan daha

Prelude> print "test\ntest\n" 
"test\ntest" 
Prelude> putStr "test\ntest\n" 
test 
test 

Diğer, sen head ve tail olmadan formatList yazmak için eşleşen deseni kullanabilirsiniz:

formatList :: (a -> String) -> [a] -> String 
formatList f [] = [] 
formatList f (x:xs) = f x ++ formatList f xs 

Ama aynıdır olarak formatList kendini tanımlamak gerek, aslında var fonksiyon concatMap:

formatList :: (a -> String) -> [a] -> String 
formatList = concatMap 

al bütün bu yapabilirsiniz birleştiren bu yüzden sadece ((++ "\n") bir section olduğuna dikkat edin) yazın:

formatLines :: [String] -> String 
formatLines = unlines 
+0

unlines, unwords değil. Ya kullanarak, fakat 1 zaten mevcut ne işaret için bir öğretici aşağıdaki ruhuna gerçekten değil. – Nefrubyr

+0

@Nefrubyr: doh, haklısın :) – Stephan202

0

Sadece

formatLines = unwords