2015-03-04 13 views
6

Dựa trên vị trí, các ứng dụng một phần trong Haskell nhận được câu trả lời đúng.Tại sao không `-` (trừ) hoạt động cho các phần của nhà điều hành?

Prelude> (/2) 10 
5.0 
Prelude> (2/) 10 
0.2 
Prelude> (+3) 10 
13 
Prelude> (3+) 10 
13 

Tuy nhiên, đối - điều hành, tôi đã nhận ra lỗi với (-3) như Haskell (dường như) diễn giải nó như một giá trị -3 ứng dụng không một phần.

Prelude> (-3) 10 

<interactive>:4:1: 
    Could not deduce (Num (a0 -> t)) 
     arising from the ambiguity check for ‘it’ 
    from the context (Num (a -> t), Num a) 
     bound by the inferred type for ‘it’: (Num (a -> t), Num a) => t 
     at <interactive>:4:1-7 
    The type variable ‘a0’ is ambiguous 
    When checking that ‘it’ 
     has the inferred type ‘forall a t. (Num (a -> t), Num a) => t’ 
    Probable cause: the inferred type is ambiguous 

Cách giải quyết vấn đề này để nhận 7 trong ví dụ này?

Trả lời

15

Sử dụng subtract. - là các nhà điều hành chỉ trong Haskell, xảy ra cả trong một tiền tố biến thể ghi vào nhị phân:

let a = -3  -- prefix variant 
let b = (-3) -- also prefix variant! 
let c = 4 - 3 -- binary variant 

Vì vậy, bạn sẽ phải sử dụng (subtract 3) 10. Xem thêm section 3.4 in the Haskell 2010 report (tôi nhấn mạnh):

Các hình thức đặc biệt -e biểu thị tiền tố phủ định, các nhà điều hành chỉ tiền tố trong Haskell, và là cú pháp cho negate (e). Toán tử nhị phân - không nhất thiết phải tham chiếu đến định nghĩa củ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 tham chiếu đến hàm negate được xác định trong Prelude. Không có liên kết nào giữa ý nghĩa địa phương của toán tử - và phủ định đơn nhất.

Phủ định tiền tố có cùng quyền ưu tiên với toán tử infix - được xác định trong Prelude (xem Bảng 4.1). Bởi vì e1-e2 phân tích cú pháp dưới dạng ứng dụng nhúng của toán tử nhị phân -, bạn phải viết e1(-e2) để phân tích cú pháp thay thế. Tương tự, (-) là cú pháp cho (\ x y -> x-y), giống như bất kỳ toán tử tổng hợp nào và không biểu thị (\ x -> -x) - người dùng phải sử dụng negate cho điều đó.

section 3.5 kết luận (một lần nữa, tôi nhấn mạnh):

- được xử lý đặc biệt trong ngữ pháp, (- exp) không phải là một phần, nhưng một ứng dụng của tiền tố phủ định, như được mô tả trong phần trước . Tuy nhiên, có chức năng subtract được xác định trong Prelude sao cho (subtract exp) tương đương với phần không được phép. Biểu thức (+ (- exp)) có thể phục vụ cùng một mục đích.

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