Làm thế nào có thể (-) dường như có hai loại khác nhau?


12

Trong ghci, khi tôi gõ

:t (-)

để tìm ra loại (-), nó trả về

(-) :: Num a => a -> a -> a

Tuy nhiên, khi tôi viết -1haskell trả về một số, dường như ngụ ý đó (-)là loại Num a => a -> a. Làm thế nào (-)dường như có thể có hai loại khác nhau?

Câu trả lời:


15

Đây là một quyết định thiết kế trong ngôn ngữ. -1là một số, nhưng việc sử dụng nó trong ngữ cảnh này không liên quan đến chức năng(-) . (Như Ackdari đề cập trong câu trả lời của họ, cách sử dụng này có liên quan đến chức năng negate.) Có một số thỏa hiệp cho phép điều này hoạt động:

  1. Bạn không thể lấy một lát bên phải của (-)toán tử. Như một giải pháp thay thế, Haskell cung cấp subtractchức năng.

  2. Bạn không thể viết một số nguyên âm mà không có dấu ngoặc đơn trừ khi nó ở đầu một bài tập (ví dụ trực tiếp sau =hoặc ->). Điều này tạo ra một lỗi phân tích cú pháp:

    let x = 8 * -1

    Thay vào đó, nó nên được viết là

    let x = 8 * (-1)

    Tuy nhiên, điều này là tốt:

    let x = -1 * 8

Đây được coi là sự đánh đổi hợp lý cho các nhà thiết kế ngôn ngữ.


8

Câu trả lời đã được giải thích trong haskell-wiki , nó nói

Điểm trừ đơn nhất là đường cú pháp cho hàm Prelude negate

Vì vậy, hàm (-)luôn luôn là a - bhàm và nếu bạn viết mã như let x = -ytrình biên dịch sẽ dịch nó sang let x = negate y.


7

Điểm trừ đơn phương là đặc biệt trong Haskell. Như đã nêu trong phần 3.4 của Báo cáo :

Biểu mẫu đặc biệt biểu thị phủ định tiền tố, toán tử tiền tố duy nhất trong Haskell và là cú pháp cho . Toán tử nhị phân không nhất thiết phải đề cập đến định nghĩa trong Prelude; nó có thể được phục hồi bởi hệ thống mô-đun. Tuy nhiên, unary sẽ luôn đề cập đến chức năng được xác định trong Prelude. Không có mối liên hệ giữa ý nghĩa cục bộ của toán tử và phủ định đơn phương.-enegate (e)---negate-


2
Các câu trả lời một câu không được khuyến khích trên SO, cũng như các liên kết mà không có bản tóm tắt nội dung của chúng, vì chúng có thể bị hỏng.
Andrew Ray

Như tôi có thể giả định rằng các liên kết đến báo cáo / tiêu chuẩn cũng bị bi quan rất nhiều so với wiki / hướng dẫn / video youtube?
bipll

@bipll Có. Vấn đề với các câu trả lời chỉ liên kết không phải là chất lượng của mục tiêu liên kết, mà là nguy cơ bị thối liên kết. Nếu bạn đã sao chép trong phần có liên quan của báo cáo, thì câu trả lời của bạn sẽ ổn.
Joseph Sible-Phục hồi lại
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.