2012-10-11 40 views
20

thể trùng lặp:
Currying subtractionTương đương với (+1) cho phép trừ là gì, vì (-1) được xem là số âm?

tôi bắt đầu dự án Haskell đầu tiên của tôi đó không phải là từ một hướng dẫn, và tất nhiên tôi vấp ngã vào những điều đơn giản nhất.

Tôi có đoạn mã sau:

moveUp y = modifyMVar_ y $ return . (+1) 
moveDn y = modifyMVar_ y $ return . (-1) 

Tôi đã mất một thời gian để hiểu tại sao mã của tôi sẽ không biên dịch: Tôi đã sử dụng (-1) được coi là một tiêu cực. Bracketting trừ đi không giúp ích khi nó tiền tố nó và làm cho 1 tham số đầu tiên của nó.

Tóm lại, phiên bản miễn phí điểm này là gì?

dec :: Num a => a -> a 
dec x = x - 1 
+0

Xem http://stackoverflow.com/questions/4454559/currying-subtraction –

Trả lời

25

Tôi tin rằng bạn muốn the conveniently-named subtract function, mà tồn tại cho chính xác lý do bạn đã phát hiện ra:

subtract :: Num a => a -> a -> a 

giống như flip (-).

- được xử lý đặc biệt trong ngữ pháp Haskell, (- e) không phải là một phần, mà là một ứng dụng phủ định tiền tố. Tuy nhiên, (subtract exp) tương đương với phần không được phép.

Nếu bạn muốn viết nó pointfree mà không sử dụng một chức năng như subtract, bạn có thể sử dụng flip (-), như tài liệu Prelude đề cập đến. Nhưng đó ... hơi xấu xí.

4

Bạn có thể sử dụng chức năng subtract (ở chế độ Chuẩn Chuẩn).

moveDn y = modifyMVar_ y $ return . (subtract 1) 

Bạn cũng có thể sử dụng lật để sắp xếp lại các tham số - mất.

moveDn y = modifyMVar_ y $ return . (flip (-) 1) 
+0

+1 ... phiên bản của tôi không có ... –

2

Nếu nêu trên subtract là quá dài dòng, bạn có thể thử một cái gì đó giống như (+ (-1)) hoặc (-1 +).

+2

Điều này có lợi thế là làm cho hai dòng mã đối xứng của tôi, như (1) và (trừ 1) không nhìn tốt bên cạnh. Tuy nhiên, điều này không thực sự gọi (-). Tất nhiên điều đó hoàn toàn ổn với Num, nhưng nếu tôi đang làm việc với các bộ không hoạt động: thêm phần tử -1 vào một tập không giống như loại bỏ phần tử 1. Trừ là tổng quát hơn, nhưng tôi sẽ sử dụng đề xuất của bạn . Tuy nhiên, tôi sẽ phải chấp nhận việc sử dụng phép trừ hoặc lật cho câu hỏi này, vì đó là câu trả lời trực tiếp hơn. – Niriel

+0

Tôi không chắc rằng tôi hiểu đơn khiếu nại của bạn, vì (-) chỉ được xác định trong các trường hợp Num. (Nếu bạn có số không giao hoán thì đây sẽ là vấn đề.) – Fixnum

+6

Vì số của bạn có vẻ là trường hợp của 'Enum' bạn cũng có thể sử dụng' succ' và 'pred'. – Fixnum

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