2016-04-14 13 views
5

Nói rằng tôi muốn thực hiện chức năng chiều dài cho các danh sách sử dụng kết hợp mô hình, sau đó tôi có thể làm một cái gì đó như thế này:Làm thế nào để Pattern phù hợp với một Vector rỗng trong Haskell?

length' :: (Num b) => [a] -> b 
length' [] = 0 
length' (_:xs) = 1 + length' xs 

Tôi có thể làm điều gì đó tương tự với Vector s?

+3

Bạn có thể sử dụng những thứ như 'ViewPatterns' và' PatternSynonyms' để khớp mẫu trên những thứ trừu tượng, nhưng nếu bạn muốn viết một hàm quy nạp như 'length' trên' Vector', tại sao không sử dụng 'foldl 'hoặc' foldr', hay bất kỳ một tá các biến thể khác của "fold" mà 'vector' cung cấp? Điều này có lợi thế là tổng quát cho mọi 'Có thể gập lại 'nếu bạn sử dụng ví dụ: 'Data.Foldable.foldr' thay vì các phiên bản cụ thể trong' vector'. – user2407038

+0

Có thể 'phân tách trường hợpAt 1 v của ...'? Có thể được tạo thành một 'ViewPattern', như đã đề xuất ở trên. – chi

+3

Hãy cẩn thận với các từ đồng nghĩa mẫu; họ có thể phá vỡ trực giác hiệu suất nếu không được thiết kế tốt. – dfeuer

Trả lời

3

Các loại khác nhau của Vector của thư viện là các loại mờ, không hiển thị các trình tạo dữ liệu của chúng và do đó bạn không thể khớp mẫu trên chúng.

Có nhiều cách xung quanh này, giống như ViewPatterns (như nhận xét của user2407038 đề cập đến), nhưng bạn chắc chắn không muốn sử dụng chúng với vectơ, bởi vì bạn muốn có lẽ ném đi những lợi thế của việc sử dụng vector .

Điểm nổi bật của thư viện vector là nó được thực hiện trên cơ sở hai khái niệm:

  1. Vectors được cụ thể hóa như kích thước cố định, mảng bộ nhớ tiếp giáp, trong đó cung cấp địa phương bộ nhớ tốt hơn nhiều so với đơn danh sách hoặc cây được liên kết;
  2. Một số lượng lớn các hoạt động vectơ được thực hiện theo các luồng hợp lý hợp nhất có các phép toán được biên dịch thành các vòng không phân bổ bộ nhớ cho các vectơ trung gian.

(1) có nghĩa là một vector không có một "đầu" tự nhiên và "đuôi" như danh sách làm-danh sách là nghĩa đen một cặp một đầu và một cái đuôi. Nếu bạn sử dụng kiểu khung nhìn để áp đặt cấu trúc đầu + đuôi trên đỉnh của vec-tơ, bạn sẽ tạo một danh sách các phần tử của vectơ được liên kết đơn, có khả năng kích hoạt cấp phát bộ nhớ cho mỗi nút của loại chế độ xem.

Và nếu bạn đang sử dụng ViewPatterns để xem một vector như những gì là có hiệu quả một danh sách liên kết đơn, tại sao không chỉ chuyển đổi các vector vào một danh sách?

Trong mọi trường hợp, vì các điểm thiết kế được đề cập ở trên, với vector bạn thực sự muốn gắn bó càng nhiều càng tốt vào the operations provided by the library itself, vì chúng sẽ khai thác các tính năng hiệu suất của thư viện.

Tôi nghi ngờ rằng có cơ hội tốt để kiểm tra kích thước của vectơ có thể là một ý tưởng tối ưu trong nhiều ngữ cảnh. Ví dụ, trong mã như thế này:

example :: Vector something -> Vector somethingElse 
example as 
    | Vector.null as = ... 
    | otherwise  = ... 

... Tôi mong chờ (nhưng chưa xác minh!) Rằng điều này sẽ buộc các vector as được cụ thể hóa để chúng tôi có thể kiểm tra xem nó rỗng hay không, nơi nếu thử nghiệm có thể được loại bỏ hoặc di chuyển ở một nơi khác thì có thể các hoạt động trong bit "..." có thể được hợp nhất với bối cảnh trong đó example được sử dụng.

+1

'Vector.empty :: Vector a' thực sự trả lại một vectơ trống. Bạn sẽ muốn sử dụng 'Vector.null :: Vector a -> Bool'. –

+1

@JanGerlinger: Rất tiếc! Tốt bắt, đã được cố định ... –

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