2011-08-09 27 views
15

Tôi muốn loại bỏ các từ khóa if ... then ... else ..., bởi vì tôi đang nhúng một ngôn ngữ/DSL trong Haskell. if, thenelse truyền đạt nhiều ý nghĩa trong nhiều miền và sẽ tuyệt vời nếu tôi xác định lại (hoặc để chúng không xác định) để phản ánh bản chất của ngôn ngữ/miền.Làm cách nào tôi có thể xóa các từ khóa "if ... then ... else ..." trong Haskell (GHC)?

Tôi đã tìm kiếm trên Google và stackoverflow, nhưng không tìm thấy gì cả. (Tôi đã tìm thấy một chuỗi cũ về lý do tại sao if ... then ... else ... được bao gồm làm từ khoá trong Haskell.)

IDE của tôi ở Leksah, và nếu từ khóa có thể bị xóa, bạn cũng nên thay đổi if ... then ... else ... từ khóa trở lại phông chữ/màu sắc/không gấp.


Tôi đã thử quy ước đặt tên là if' cho if v.v. Nó không cảm thấy là tốt, đặc biệt là khi tôi muốn xác định ifif' và phải xác định if'if'' thay thế hoặc if1if2. Sự hiện diện của cả hai số if'if cũng có thể gây nhầm lẫn. (Sự nhầm lẫn không phải là một vấn đề nghiêm trọng trong tình huống của tôi khi người dùng DSL là lập trình viên Haskell, nhưng tôi cho rằng nó có thể giúp đỡ trong các tình huống khác).


Tóm tắt các câu trả lời cho đến nay:

  • Sử dụng tiện ích RebindableSyntax để GHC. Không phải là chung chung như loại bỏ các từ khóa: cú pháp của Haskell nếu-thì-else được giữ lại. (Frerich Raabe)
  • Cách giải quyết: Sử dụng các từ/tên rất giống nhau, bằng cách sử dụng data Conditional b a = If b (Then a) (Else a) (chỉ áp dụng trong một số ngữ cảnh). (C. A. McCann)

Nếu RebindableSyntax là một tính năng tương đối mới, thì đó là khó có thể tìm thấy một cách tổng quát hơn, ít nhất là không cho đến phiên bản tiếp theo của GHC.

+0

Bạn có thực sự muốn _remove_ từ khóa của ngôn ngữ để trình biên dịch có thể coi chúng là biến không? – eternalmatt

+3

Nếu DSL của bạn đủ khác biệt so với Haskell xung quanh, và hoạt động bằng cách xây dựng một số loại cấu trúc dữ liệu biểu diễn các biểu thức trong DSL, bạn cũng có thể chỉ sử dụng một kiểu dữ liệu. ví dụ, một cái gì đó như 'dữ liệu Có điều kiện b a = Nếu b (Sau đó a) (Khác a)'. –

+0

Bạn nên nhớ rằng bạn không nên thiết kế DSL của bạn để làm cho mã trông giống như tiếng Anh, bạn nên thiết kế chúng để làm cho nó dễ dàng để xem nếu mã không hoạt động. – Anonymous

Trả lời

29

Phần mở rộng RebindableSyntax cho GHC cho phép bạn quá tải biểu thức if ... then ... else bằng phiên bản của riêng bạn. Cụ thể, hàm ifThenElse được sử dụng để xác định ý nghĩa thay thế. if e1 then e2 else e3" có nghĩa là ifThenElse e1 e2 e3.

Xem bài viết trên blog Rebindable if..then..else expressions để có cuộc thảo luận tốt đẹp về tính năng này, bao gồm một số ví dụ.

0

Làm thế nào về:

cond True t _ = t 
cond False _ f = f 
+1

Điều này là thiếu điểm, thực sự. Tất nhiên chúng ta có thể thực hiện hành vi tương tự như "nếu ... thì ... khác ..." với một cái tên khác, nhưng điều chúng ta thực sự muốn là một hành vi khác với cùng tên. –

+0

@Daniel Wagner: Đủ công bằng. – user2023370

11

Bạn không thể xóa các từ khóa hiện. Như đã được chỉ ra, bạn có thể sử dụng RebindableSyntax, nhưng điều đó có thể không làm những gì bạn muốn.

Điều duy nhất nhận được gần với từ khóa tháo là bật tùy chọn CPP và làm một cái gì đó giống như

#define if if_ 
#define then then_ 
#define else else_ 

Các preprocessor sau đó sẽ mở rộng nếu/rồi/khác để if_/then_/else_.

+1

Làm điều đó một cách ngây thơ sẽ không an toàn. Làm điều đó đúng cách sẽ liên quan đến việc viết một trình phân tích cú pháp Haskell để tái cấu trúc mã Haskell ... –

+0

Chắc chắn không an toàn nói chung. – augustss

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