2013-04-24 24 views
6

Khi làm việc với các góc theo độ, tôi muốn xác định biểu tượng độ (°) để được sử dụng làm toán tử postfix. Hiện nay, tôi sử dụng dòng này (trong GHCi):Làm cách nào để xác định toán tử postfix trong Haskell?

let o = pi/180 

và sử dụng nó như thế này:

tan(11*o) 

nhưng tôi muốn chỉ cần đi:

tan 11° 

đó là rõ ràng hơn nhiều. Toán tử độ phải có mức ưu tiên cao hơn ‘tan’ và các chức năng khác.

Gần nhất tôi nhận được là:

let (°) x _ = x*pi/180 

sử dụng như thế này:

tan(11°0) 

nhưng ưu tiên mặc định có nghĩa là dấu ngoặc vẫn là cần thiết, và với số giả, thay thế này là tệ hơn những gì tôi hiện đang sử dụng.

+8

"Toán tử độ phải có mức ưu tiên cao hơn' tan' và các hàm khác. " <- Điều đó sẽ không hoạt động, ứng dụng chức năng có ưu tiên cao nhất theo đặc tả ngôn ngữ. –

+0

Tại sao bạn không chỉ định nghĩa một kiểu số mới (gói Đôi hoặc bất kỳ thứ gì) với một kiểu mới đại diện cho độ? Tất nhiên bạn sẽ phải chú ý đến bản chất "mô-đun" của độ nếu bạn muốn xác định sự bình đẳng, v.v. –

+0

Haskell không phải là loại ngôn ngữ mà bạn có thể thực hiện mọi thứ biên dịch theo cách bạn đang sử dụng để viết nó. Không giống như Perl hoặc thậm chí Python, cú pháp của Haskell thực sự được cắt xén và đơn giản, nó chỉ được thiết kế rất tốt mà ngay cả cơ sở đơn giản này cũng cho phép rất nhiều thứ viết tắt rất hiệu quả. để mọi thứ trở nên dễ đọc. Nhưng điểm thứ hai là một phần vì có những quy tắc phân tích cú pháp khá cứng nhắc này. – leftaroundabout

Trả lời

3

Kiểm tra fixity declarations, cho phép bạn thay đổi mức độ ưu tiên của các toán tử kết xuất. Hãy cẩn thận không đặt mức độ ưu tiên quá cao hoặc các nhà khai thác khác sẽ không hoạt động như mong đợi.

Ví dụ:

infixl 7 ° 
(°) x _ = x*pi/180 

Edit: ah, @Daniel Fischer đúng - điều này sẽ không làm việc cho nhu cầu hiện tại của bạn bởi vì ứng dụng hàm có ưu tiên cao nhất

11

Bạn không có thể, ít nhất trong Haskell như được xác định bởi Báo cáo. Tuy nhiên, có a GHC extension that allows postfix operators.

Rất tiếc, điều này không cung cấp cho bạn mọi thứ bạn muốn; đặc biệt, nó vẫn yêu cầu dấu ngoặc đơn, như toán tử phủ định đơn nhất thường làm.

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