2010-07-30 38 views
6

Cách (hoặc có cách nào) thành ngữ để tách các dòng mới khỏi chuỗi trong Haskell? Hoặc tôi có phải tự tạo bằng cách tìm các dòng mới/dấu cách và sau đó xóa chúng?Tách dòng mới trong Haskell

EDIT: Tôi đang tìm kiếm những gì rstrip Python thực hiện, nhưng không cần "ký tự" bắt buộc đối số:

string.rstrip (s [, chars])

Return một bản sao của chuỗi ký tự có dấu đã bị xóa. Nếu ký tự bị bỏ qua hoặc Không, khoảng trống ký tự sẽ bị xóa. Nếu được đưa ra và không Không, ký tự phải là một chuỗi; các ký tự trong chuỗi sẽ bị tước từ cuối chuỗi phương thức này được gọi.

+2

Trong khi cả hai câu hỏi của bạn và các câu trả lời khác nhau cho thỏa thuận với việc thực hiện chức năng 'rstrip' Python trong Haskell, sử dụng nó không phải là rất thành ngữ trong Haskell trong hầu hết các trường hợp. Thông thường, bạn sẽ sử dụng 'dòng' và' từ', trừ khi có một số lý do đặc biệt khác. – Yitz

Trả lời

9

Đây là một thực hiện đơn giản (chuyển thể từ Wikipedia):

import Data.Char (isSpace) 
rstrip = reverse . dropWhile isSpace . reverse 

Ngoài ra còn có một rstrip đã được xác định trong Data.String.Utils.

(Bằng cách này, Hayoo! là một nguồn lực lớn cho các loại hình câu hỏi: một tìm kiếm cho rstrip sẽ đưa bạn trực tiếp đến Data.String.Utils.)

+0

Tôi chưa bao giờ xem trong Data.String.Utils trước đây. Hữu ích. Và rstrip trông giống như chính xác những gì được mong muốn. –

3

Tùy thuộc vào những gì bạn có nghĩa là:

 
Prelude> filter (/= '\n') "foo\n\nbar\n" 
"foobar" 

Prelude> words "foo\n\nbar\n" 
["foo","bar"] 

Nhưng những không đối phó với không gian độc đáo. Vì vậy, có lẽ không phải những gì bạn đang tìm kiếm.

+2

Không thực sự là "dải" chuỗi này, mặc dù (theo nghĩa thông thường là "loại bỏ các ký tự đầu hoặc cuối"). –

2

Tôi sử dụng này ngày khác:

Prelude> let trimnl = reverse . dropWhile (=='\n') . reverse 
Prelude> trimnl "" 
"" 
Prelude> trimnl "\n" 
"" 
Prelude> trimnl "a\n" 
"a" 
Prelude> trimnl "a\n\n" 
"a" 
Prelude> trimnl "a\nb\n" 
"a\nb" 
+0

Đó là nguyên tắc tương tự như câu trả lời của Travis. – kennytm

+0

Có, tôi đoán chúng tôi đã nhập cùng một lúc.Nhưng tôi làm những gì các poster yêu cầu! Bầu cho tôi! :) –

+0

Tôi nghĩ trimnl = ngược lại. dropwhile ('elem'" \ n \ r \ t "). đảo ngược sẽ được gần gũi hơn với rtrim trong python –

3

Nếu đây là cho một ứng dụng tập đọc điển hình, sau đó có lẽ bạn nên bắt đầu với lines. Điều này có thể cho phép bạn để tránh Data.String.Utils.rstrip hoàn toàn:

> lines "one time\na moose\nbit my sister\n" 
["one time", "a moose", "bit my sister"] 

Như bạn thấy, lines mất nội dung của toàn bộ tập tin và đúng cách biến mỗi dòng vào một chuỗi không có ký tự dòng mới. Điều này có nghĩa bạn có thể viết một chương trình như vậy:

main = mapM_ (putStrLn . process) . lines =<< readFile "foo.txt" 
    where process :: String -> String 
     process = -- your code here --