2010-10-22 23 views
7

Cabal đang cho tôi thông điệp hỗn hợp. Khi tôi nói:DeriveFunctor có phải là tiện ích mở rộng được công nhận không? Cabal có vẻ bối rối

Extensions: DeriveFunctor 

Nó nói:

Warning: Unknown extensions: DeriveFunctor 

Nhưng khi tôi nói:

GHC-Options: -XDeriveFunctor 

Nó nói:

Warning: Instead of 'ghc-options: -XDeriveFunctor' use 'extensions: 
DeriveFunctor' 

Còn bây giờ tôi chỉ cần đi để sử dụng pragma {-# LANGUAGE DeriveFunctor #-}.

$ cabal --version 
cabal-install version 0.8.2 
using version 1.8.0.6 of the Cabal library 
$ ghc --version 
The Glorious Glasgow Haskell Compilation System, version 6.12.3 
$ basename $(mdfind haskell-platform | grep .dmg) 
haskell-platform-2010.2.0.0.i386.dmg 
+0

Phiên bản GHC hoặc Haskell nào bạn đang sử dụng> –

+0

Đã thêm thông tin phiên bản khác. –

+0

Tôi không biết về cảnh báo cụ thể này, nhưng tôi nghĩ rằng việc thêm một pragma LANGUAGE bên trong tệp là tùy chọn tốt nhất. –

Trả lời

4

Theo số Hackage documentation, như của Cabal-1.8.0.6 DeriveFunctor không được nhận dạng. Đó là một bổ sung tương đối mới cho GHC và nó dường như không có sử dụng rộng rãi, vì vậy tôi không ngạc nhiên khi nó đã bị bỏ qua cho Cabal. Điều này có lẽ nên được nộp như một lỗi (yêu cầu tính năng?) Chống lại Cabal.

@Tom Lokhorst đúng là một pragma LANGUAGE là lựa chọn tốt nhất. Tôi không thích sử dụng trường Tiện ích mở rộng của Cabal vì tất cả các tiện ích mở rộng đều hoạt động đối với tất cả các mô-đun mà tôi thường không muốn.

+1

OK Tôi đã báo cáo: http://hackage.haskell.org/trac/hackage/ticket/751 –

+1

Cảm ơn bạn đã gửi báo cáo lỗi; Tôi đã thêm một bản vá. –

7

Bạn vẫn có thể sử dụng extensions: DeriveFunctor trong tệp .cabal của mình. Có, nó không phải là một phần mở rộng mà hiện đang được biết đến với Cabal, nhưng bạn vẫn có thể sử dụng nó và miễn là trình biên dịch nhận ra nó thì nó sẽ hoạt động. Thật vậy Cabal sẽ kiểm tra rằng trình biên dịch không nhận ra phần mở rộng, mặc dù Cabal không tự biết về nó.

Có đăng ký trung tâm của các tiện ích trong mô-đun Language.Haskell.Extension. Mục đích của sổ đăng ký này là để các trình biên dịch khác nhau có thể đồng ý trên cùng một tên khi chúng triển khai cùng một phần mở rộng. Chúng tôi đã có trường hợp trong quá khứ, nơi các tác giả của các trình biên dịch khác nhau đã vô tình đưa ra các tên khác nhau cho cùng một khái niệm mở rộng. Không phải tất cả tiện ích đều phải được đăng ký. Nó có ý nghĩa không để đăng ký phần mở rộng mà vẫn còn thử nghiệm cao, ví dụ như phần mở rộng DPH "PArr" vẫn chưa được đăng ký. Hackage yêu cầu tất cả các gói đã tải lên chỉ sử dụng các phần mở rộng đã đăng ký đã biết, điều này có ý nghĩa vì nếu một phần mở rộng đủ sẵn sàng để sử dụng trong một gói phân tán thì bạn có thể đăng ký.

Trong trường hợp cụ thể này, các nhà phát triển GHC dường như đã quên đăng ký tiện ích.

Điều đáng lưu ý là Cabal-1.10 trường extensions đang được chia thành hai: default-extensionsother-extensions. Điều này giải quyết vấn đề mà John chỉ ra trong câu trả lời của anh ta, rằng hành vi trước đó là tất cả các phần mở rộng đều hoạt động cho tất cả các mô-đun, mà chúng tôi thừa nhận là một sai lầm. Trường other-extensions cho phép các tiện ích được sử dụng trong một số mô-đun (tức là với LANGUAGE pragma) được liệt kê. Cabal cuối cùng sẽ thực thi thực thi rằng tất cả chúng đều được liệt kê, giống như yêu cầu tất cả các gói phụ thuộc được liệt kê. Ngôn ngữ phụ thuộc là phụ thuộc quá.

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