2009-11-18 3 views
6

Xin chào. Đối với một hướng dẫn trong tuần này, một trong các câu hỏi sẽ yêu cầu tạo một định dạng hàm bằng cách sử dụng các hàm khác formatLine và formatList, để định dạng một danh sách các dòng.Dòng mới Haskell

Mã của tôi trông như thế này;

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 

Mã dường như (với tôi, ít nhất) như nó sẽ hoạt động, nhưng thay vì tạo dòng mới trong đó \ n "" được \ n "" được thêm vào chuỗi.

Mọi trợ giúp sẽ được đánh giá cao.

+2

'formatList = map' – Chuck

Trả lời

21

Đó là vì bạn có thể đang sử dụng print để in kết quả. Thay vào đó, hãy sử dụng putStr. Quan sát:

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

Ngoài ra, bạn có thể sử dụng mô hình phù hợp để viết formatList mà không headtail:

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

Nhưng có thực sự là không cần phải xác định formatList mình, vì nó giống với chức năng concatMap:

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

Kết hợp tất cả điều này, bạn có thể vì vậy chỉ cần viết (lưu ý rằng (++ "\n") là một section):

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

... mà lần lượt tương đương với unlines:

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

unlines, not unwords. Sử dụng hoặc là không thực sự theo tinh thần làm theo hướng dẫn, nhưng +1 để chỉ ra những gì đã có sẵn. – Nefrubyr

+0

@Nefrubyr: doh, bạn nói đúng :) – Stephan202

0

Chỉ cần cố gắng

formatLines = unwords