2009-08-25 14 views
7

Tôi là một người mới bắt đầu với Haskell và tôi đã bắt đầu nhìn thấy các lỗi tương tự như:Haskell: -fglasgow-exts có nên tránh mã yêu cầu điều này không?

Illegal parallel list comprehension: use -fglasgow-exts 

Tôi đang làm việc trong ghci và với ghc nhưng chỉ do thực tế rằng nó là người đầu tiên tôi tìm thấy trên một tìm kiếm .

Tôi tò mò nếu đây là loại tình huống mà bạn muốn tránh tiếp tục. Bất kỳ tìm kiếm nào tôi đã đề cập đến là các tiện ích mở rộng này hiển thị các cơ sở cơ bản có thể (hoặc có thể không) hữu ích.

Một ví dụ cụ thể là

fibs = 0 : 1 : [ a + b | a <- fibs | b <- tail fibs ] 

tôi giả sử một thực tế rằng cả hai ab đang đọc từ danh sách cùng một lúc gây ra vấn đề ở đây ...? Vì vậy, nếu phần mở rộng glasgow là phương tiện duy nhất để hỗ trợ cấu trúc này thì việc tạo danh sách theo cách khác hay chỉ giả định rằng các phần mở rộng sẽ có sẵn là phổ biến hơn?

Cảm ơn trước về mọi đầu vào.

[EDIT] Xin lỗi nếu điều này không hoàn toàn rõ ràng, nhưng câu hỏi của tôi là nếu bao gồm phần mở rộng glasgow (hoặc bất kỳ tiện ích mở rộng nào khác) được coi là thực hành không tốt. Ví dụ trên chỉ để minh họa loại lỗi đã nhắc câu hỏi này.

Trả lời

12

Thay vì yêu cầu tất cả phần mở rộng GHC, xác định mà những người đang sử dụng bằng cách sử dụng cơ chế LANGUAGE pragma:

{-# LANGUAGE ParallelListComp #-} 
xy = [ x+y | x <- [1, 2, 3, 4] | y <- [5, 6, 7, 8] ] 

tôi giả sử một thực tế rằng cả hai ab đang đọc từ danh sách ở đồng thời gây ra vấn đề ở đây ...? Vì vậy, nếu các tiện ích mở rộng glasgow là chỉ có nghĩa là để hỗ trợ cấu trúc này là phổ biến hơn để tạo danh sách một cách khác hoặc chỉ giả định rằng các tiện ích mở rộng sẽ có sẵn?

Lặp song song trên cùng một danh sách được cho phép. Vấn đề là việc hiểu thấu song song không được định nghĩa trong tiêu chuẩn Haskell 98. Họ có thể dễ dàng mô phỏng sử dụng zip:

xy = [x+y | (x,y) <- zip [1, 2, 3, 4] [5, 6, 7, 8]] 

Extensions bản thân không phải là xấu - hầu hết các thư viện chuẩn sử dụng phần mở rộng, của một hay hình thức khác. Nhiều người đang được xem xét để đưa vào Haskell', lần lặp tiếp theo của tiêu chuẩn Haskell.Một số tiện ích mở rộng, chẳng hạn như GADT thường được sử dụng trong các thư viện được viết bởi người dùng. Những người khác, chẳng hạn như mẫu hoặc trường hợp không liên quan, có thể không phải là ý tưởng hay để sử dụng trừ khi bạn thực sự biết bạn đang làm gì.

Bất kỳ tiện ích mở rộng nào được liệt kê trong HaskellExtensions wiki page với sự hỗ trợ từ hai hoặc nhiều trình biên dịch có thể an toàn để sử dụng.

+0

Đúng vậy, nhưng tôi giả định rằng vẫn chèn các phần mở rộng cụ thể vào cơ sở mã. Câu hỏi của tôi là liệu đó có phải là thực hành tốt hay không. Ví dụ, trong C một là miễn phí để bao gồm một tập tin nguồn trong một #include chỉ thị, nhưng điều này được coi là thực hành xấu. – ezpz

+0

@ezpz: Tôi hiểu rồi. Tôi sẽ cập nhật câu trả lời của mình. Phiên bản ngắn: nó phụ thuộc vào phần mở rộng, nhưng nhiều người được an toàn và thậm chí có lợi để sử dụng. Tôi không nghĩ rằng sự hiểu thấu song song đủ rộng để đủ điều kiện như vậy. –

+0

Cảm ơn bạn đã liên kết - đó chính xác là loại thông tin mà tôi đang xem xét. – ezpz

6

GHC chắc chắn phổ biến - tôi nghĩ đó là trình biên dịch Haskell được sử dụng nhiều nhất, vì vậy nó có thể sẽ không gây ra quá nhiều rắc rối. Bạn nên luôn luôn cố gắng viết mã tuân thủ tiêu chuẩn, mặc dù - có thể không cho các dự án cá nhân, nhưng đối với OSS hoặc công việc, chắc chắn.

Mọi thứ đều có thể xảy ra, đúng không? Vì vậy, có thể thay đổi đột ngột trong trình biên dịch một nửa thông qua dự án của bạn.

Với PMNM, những người khác nhau sử dụng các trình biên dịch khác nhau - ví dụ: HUGS cũng khá phổ biến.

3

gì bạn muốn là:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs) 

Điều này là do danh sách comprehensions không thực sự làm việc với danh sách tự tham chiếu. Ngoài ra, mặc dù GHC phổ biến hơn, HUGS thường tạo ra các thông báo lỗi rõ ràng hơn.

+0

OT: bên ngoài đầu ra lỗi sạch hơn, bạn sẽ đề xuất HUGS trên GHC trên bảng? – ezpz

+3

> bạn sẽ đề xuất HUGS trên GHC trên bảng? Tuyệt đối không. GHC là tiêu chuẩn thực tế và là hệ thống duy nhất được sử dụng trong sản xuất. –

+2

Làm việc với Hugs có thể là một bài tập hữu ích trong việc giữ cho mã của bạn dễ dàng hơn, điều này có thể quan trọng đối với người dùng hệ thống Haskell cũ hoặc thay thế, tùy thuộc vào cách bạn mong đợi mã của mình tồn tại. –

6

Sử dụng tiện ích là tốt. Gắn cờ riêng cho họ bằng -XFoo hoặc LANGUAGE FOO. Tiện ích mở rộng nào bạn chọn sử dụng tùy thuộc vào bạn, bạn có thể muốn gắn vào những tiện ích được liệt kê để đưa vào Haskell Prime.

1

Tôi sẽ đề xuất sử dụng "," thay vì "|", nhưng sau đó tôi đã học được điều này làm điều gì đó khác hơn tôi mong đợi.

Vì vậy, ngoài tính di động, bạn cũng nên cân nhắc khả năng đọc. Việc sử dụng các tiện ích mở rộng không phổ biến có thể làm cho mã của bạn khó đọc hơn (đối với những người không quen với các tiện ích mở rộng).

Một số tiện ích mở rộng không có bất kỳ tác động tiêu cực nào đối với khả năng đọc (mã kết quả là hiển nhiên), như MultiParamTypeClasses, FlexibleContexts, FlexibleInstances.

Những người khác yêu cầu người đọc phải quen thuộc với cú pháp mới và hiểu ý nghĩa của cú pháp này. Ví dụ cho những người này sẽ là ParallelListComp, TypeFamilies, FunctionalDependencies. Trong trường hợp này, tôi khuyên bạn nên cố gắng tránh các phần mở rộng này trừ khi chúng mang lại lợi ích. Trong trường hợp này, bạn chỉ có thể sử dụng zip như John Millikin đã đề xuất hoặc cấu trúc lại mã như được đề xuất không xác định.

Đề xuất của 1 con rồng về việc sử dụng những đề xuất được lên kế hoạch để được bao gồm trong Haskell Prime.

Haskell 2010 là do được phát hành vào cuối năm 2009. Tập hợp các thay đổi được kết hợp sẽ được công bố tại Hội nghị chuyên đề Haskell, ngày 03 tháng chín năm 2009.

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