2013-05-31 26 views
7

tôi cần phải thực hiện sử dụng rộng rãi:cách Idiomatic để có một chuỗi con của một ByteString

slice :: Int -> Int -> ByteString -> ByteString 
slice start len = take len . drop start 

Hai phần câu hỏi:

  1. Điều này đã có một cái tên? Tôi không thể tìm thấy bất kỳ thứ gì tìm kiếm loại đó trên Hoogle, nhưng có vẻ như đó là một nhu cầu thực sự phổ biến. Tôi cũng đã thử tìm kiếm (Int, Int) -> ByteString -> ByteString và một số phiên bản giống nhau của flip. Tôi cũng đã thử tìm kiếm các phiên bản [a] để xem có tên nào được sử dụng phổ biến không.
  2. Có cách nào tốt hơn để viết không?

Tôi nghi ngờ rằng tôi đang làm điều gì đó sai vì tôi dự kiến ​​sẽ tìm thấy rất nhiều người đã đi xuống cùng một con đường, nhưng google-fu của tôi không tìm thấy bất cứ điều gì.

+0

Điều này có liên quan: http://stackoverflow.com/questions/4597820/does-haskell-have-list-slices-i-e-python – jozefg

+1

Cảm ơn jozefg. Một trong những câu trả lời có đề cập đến "slice :: Int -> Int -> Vector a -> Vector a', do đó, đó là tiền lệ cho sự lựa chọn tên. –

+2

Tôi khá chắc chắn theo cách của bạn là cách thành ngữ (và tốt hơn so với câu trả lời được liên kết). Nó cũng là cách hiệu quả nhất (cả hai hoạt động là O (1)). –

Trả lời

6

Cách thành ngữ là qua takedrop, trong đó có O (1) độ phức tạp đối với các yêu cầu nghiêm ngặt.

slice không được cung cấp, để ngăn sự phụ thuộc vào các hoạt động lập chỉ mục không an toàn.

+0

Trực tiếp từ miệng ngựa. Cảm ơn bạn đã làm việc trên thư viện và cho câu trả lời. –

1

Theo tài liệu không có chức năng như vậy. ByteStrings hiện tại nghiêm ngặt là represented làm con trỏ để bắt đầu pinned memory, độ lệch và độ dài. Vì vậy, thực sự, thực hiện của bạn là cách tốt hơn để làm mối nối. Tuy nhiên, bạn nên cẩn thận với các mối nối bởi vì các chuỗi ký tự ghép nối có cùng một khoảng trống giống như giá trị ban đầu. Để tránh điều này, bạn có thể muốn copy kết thúc ghép nối, nhưng điều này không phải lúc nào cũng nhất thiết.

Các vấn đề liên quan