2012-01-28 28 views
10

Tôi thường tin tưởng vào việc sử dụng các không gian tên (tên mô-đun đủ điều kiện) trong hầu hết các ngôn ngữ tôi lập trình. từ. Trong Haskell cũng có lợi thế bổ sung là tránh các xung đột tên phổ biến với các hàm Prelude.Làm cách nào để xử lý các biểu tượng infix trông xấu xí với các tên đủ điều kiện

Tuy nhiên, tôi cảm thấy như phải đặt một namespace trên một biểu tượng trung tố (hoặc, định danh DSL-y ngắn khác) trông thật sự lạ vì vậy tôi đang bị cám dỗ để tái xuất khẩu giá trị, như thế này:

import qualified Data.Sequence as Seq 
(|>) = (Seq.|>) 
(<|) = (Seq.<|) 

gì đang làm phiền tôi bây giờ là

  • Giá trị xem lại thủ công giống như bản mẫu nhàm chán.

  • thủ reexporting giá trị đi xung quanh hệ thống mô-đun hiện có và dường như không làm việc với nhà thầu dữ liệu (và có thể là những thứ khác tôi đã không đi qua chưa)

    import qualified Data.Sequence as Seq 
    (:>) = (Seq.:>) --gives me a parse error: 
           --"Not in scope: data constructor `:>'" 
    

Làm thế nào để hòa hợp các biểu tượng infix và không gian tên? Tôi có nên từ bỏ và học cách không gian tên mọi thứ? Có các phương pháp hay nhất về Haskell về cách đặt tên và ký hiệu không?

Trả lời

19

Vâng, có một điều bạn có thể làm là nhập nó hai lần:

import Data.Sequence ((|>), (<|), ViewR ((:>))) 
import qualified Data.Sequence as Seq 

này sẽ nhập khẩu chỉ :>, |><| không đủ tiêu chuẩn, để lại mọi thứ khác đủ điều kiện. Lưu ý rằng vì :> là một hàm tạo dữ liệu, bạn cũng phải nhập kiểu dữ liệu của nó (ViewR), nhưng bạn thực hiện không phải nhập phần còn lại của các hàm tạo của ViewR.

Ngoài ra, nếu bạn đang lo lắng về xung đột, bạn nên chỉ ẩn các nhà điều hành cho phù hợp:

import Prelude hiding ((.)) 

Nếu bạn đang sử dụng một thư viện lành mạnh, một cuộc xung đột với Prelude có nghĩa là chức năng thư viện được thiết kế để thay thế rằng chức năng Prelude (ví dụ: Control.Category), do đó bạn muốn để nó thay thế ý nghĩa mặc định.

Theo như thực tiễn tốt nhất, tôi chưa bao giờ thấy bất kỳ ai sử dụng toán tử đủ điều kiện trừ khi có xung đột hoặc họ đang ở GHCi. Tất cả đã nói, ngay cả bao thanh toán trong lợi thế của biết nơi một nhà điều hành là từ, nó làm cho mã ít dễ đọc hơn.

8

tôi thường nhập tên loại, nhà thầu và các nhà khai thác không đủ tiêu chuẩn, và mọi thứ khác có trình độ:

import Data.Sequence (Seq, ViewL(..), ViewR(..), (|>), (<|)) 
import qualified Data.Sequence as Seq 

này đúp nhập khẩu, không đủ tiêu chuẩn kiểu tên kiểu là khuyến cáo của tài liệu để Data.Map và container tiêu chuẩn khác .

Tuy nhiên, bạn có thể không phải lúc nào nhập nhà khai thác không đủ tiêu chuẩn - ví dụ, nếu bạn đang sử dụng Array/VectorMap trong module tương tự, bạn không thể nhập các (!) từ cả hai không đủ điều kiện. Trong trường hợp đó, tôi thường chỉ sử dụng nó đủ điều kiện. Nó có vẻ kỳ lạ, nhưng nó tốt hơn so với các tùy chọn khác (như đến với tên riêng của bạn cho một trong số họ để tránh một cuộc đụng độ). Tất nhiên, có lẽ đây là một điều tốt nếu nó dừng mọi người sử dụng các chức năng không an toàn như (Data.Map.!) :)

+0

Khi tôi thử điều này, tôi nhận được lỗi sau trong quá trình biên dịch: 'Việc nhập 'bất cứ điều gì' là dư thừa'. Bạn có nhận được điều này không? Có thể loại bỏ cảnh báo không? – VF1

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