2016-02-06 13 views
7

Tôi sẽ xem qua hướng dẫn learn you a haskell và Tôi đã xem xét một số ví dụ mà tác giả đã đưa ra.Kết hợp mẫu Haskell: Khả năng đọc và hiệu suất

Ví dụ ông reimplemented zip như sau:

zip' :: [a] -> [b] -> [(a,b)] 
zip' _ [] = [] 
zip' [] _ = [] 
zip' (x:xs) (y:ys) = (x,y):zip' xs ys 

Ông sử dụng một cách tiếp cận tương tự cho tất cả các ví dụ khác của mình, nơi ông đặt các mô hình cụ thể nhất đầu tiên. Đây là phiên bản hơi khác nhau một chút:

zip' :: [a] -> [b] -> [(a,b)] 
zip' (x:xs) (y:ys) = (x, y):zip' xs ys 
zip' _ _   = [] 

Theo tôi hiểu cả hai phương pháp cũng làm như vậy. Nếu một danh sách trống được cung cấp theo cách (x: xs) hoặc (y: ys) sẽ không khớp với danh sách sẽ kết thúc đệ quy bằng cách thêm danh sách trống [].

  1. Cá nhân tôi thích phiên bản thứ hai để dễ đọc hơn, nhưng có thể tôi đã sai khi làm như vậy.
  2. Có ảnh hưởng gì đến hiệu suất của phương pháp không? Theo như tôi hiểu nếu mẫu trên cùng không phù hợp, Haskell sẽ kiểm tra mô hình tiếp theo. Thứ tự của các mẫu có ảnh hưởng đến hiệu suất không?
  3. liên quan

Kind,

Edit:

Có thể lặp lại của: Haskell GHC: what is the time complexity of a pattern match with N constructors?

Tóm tắt: Thứ tự của các mẫu là rất quan trọng đối với ngữ nghĩa (về thẩm định nghiêm ngặt của các đối số) và khả năng đọc của một hàm. Bản thân đối sánh mẫu sẽ luôn ở trong trạng thái phức tạp thời gian O (1).

+0

Bản sao có thể có của [Haskell GHC: độ phức tạp thời gian của mẫu khớp với N constructors là gì?] (Http://stackoverflow.com/questions/9027384/haskell-ghc-what-is-the-time-complexity -of-a-pattern-match-with-n-constructors) – Nimi

Trả lời

7

Theo tôi hiểu cả hai phương pháp cũng làm như vậy.

gần như; với một ngoại lệ:

\> zip' undefined [] -- 1st definition of zip' 
[] 
\> zip' (filter (< 4) [1..]) [1, 2, 3] 
[(1,1),(2,2),(3,3)] 

khi:

\> zip' undefined [] -- 2nd definition of zip' 
*** Exception: Prelude.undefined 
\> zip' (filter (< 4) [1..]) [1, 2, 3] 
[(1,1),(2,2),(3,3) -- gets stuck here; never returns 

nói cách khác, định nghĩa thứ 2 luôn buộc weak head normal form cho cả đối số.

Hiệu suất khôn ngoan, điều này có nghĩa là người ta có thể xây dựng một ví dụ bệnh lý sao cho WHNF liên quan đến tính toán nặng, do đó một định nghĩa hoạt động rất khác.

+3

Điều đó đúng. Nhưng 'zip 'undefined [1, 2, 3]' sẽ tạo ra một ngoại lệ trong cả hai trường hợp. Vì vậy, tôi không thể thấy điều này giúp ích hay đúng hơn tại sao nó sẽ là mong muốn. – Nimi

+1

@Nimi, trong trường hợp này, nó chỉ xác định * đối số nào là vô cùng nghiêm ngặt. – dfeuer

+1

@Nimi điểm là bạn có thể làm cho hai chức năng hoạt động rất khác nhau và không làm điều tương tự. lưu ý ví dụ khác, 'zip '(bộ lọc (<4) [1 ..]) [1, 2, 3]' để xem cách điều này cũng có thể tác động đến hiệu suất. –

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