2011-01-16 31 views
5

Tại saoTại sao cả bản đồ (^ 2) xs và bản đồ (2 ^) xs hoạt động như mong đợi trong Haskell?

map (^2) [1..10] 

công việc và cũng

map (2^) [1..10] 

làm việc?

Tôi hy vọng nó chỉ hoạt động với một trong số chúng, không phải cho cả hai.

Tôi nghĩ bản đồ sẽ lặp qua tất cả các yếu tố của [1..10] và sau đó làm

[1^2, 2^2, 3^2, ...] 

cho map (^2) [1..10]. Sau đó, tôi hy vọng rằng khi được đưa ra map (2^) [1..10], nó sẽ mang lại lỗi sintax hoặc một cái gì đó, bởi vì nó cần các số sau ^, không phải trước đây.

+4

Tại sao bạn mong đợi nó chỉ hoạt động đối với một trong số chúng? – sepp2k

+1

Tôi phải nói rằng tôi hoàn toàn không hiểu câu hỏi nào cả, cho đến khi luqui trả lời. Nếu bạn chỉ cần đọc [Báo cáo Haskell] (http://www.haskell.org/onlinereport/haskell2010/), điều đó rõ ràng là ý nghĩa của '(^ 2)' và '(2 ^)'. (Sau đó, một lần nữa, tôi đọc toàn bộ thông số ngôn ngữ trước khi sử dụng bất kỳ ngôn ngữ lập trình mới nào; tôi đã nói đó là một thói quen kỳ lạ…) – ephemient

+0

Đó là một thói quen kỳ quặc nhưng tuyệt vời để giữ nó. – Davorak

Trả lời

16

Ngữ pháp Haskell đã hỗ trợ đặc biệt dành cho xây dựng như thế này, được gọi là "bộ phận điều hành". Nếu bạn có bất kỳ nhà điều hành ghi, giống như nói #$%, sau đó các ký hiệu sau đây được hỗ trợ:

(#$%) = \x y -> x #$% y 
(#$% y) = \x -> x #$% y 
(x #$%) = \y -> x #$% y 

Vì vậy, bạn đang mong đợi một số quán toán học để phá vỡ này, và nếu Haskell là một ngôn ngữ rất nhỏ như Forth, tôi sẽ nghiêng để đồng ý với trực giác của bạn. Lý do nó hoạt động về cơ bản là "bởi vì họ đã viết nó để làm việc như thế".

(Nó đã được bổ sung cũng làm giảm sự mơ hồ - không f + x nghĩa f áp dụng cho hai đối số, hoặc có nghĩa là + áp dụng cho hai đối Kể từ khi nó thực sự có nghĩa là sau này, làm thế nào để chúng tôi đại diện cho cựu trả lời: sử dụng? () để giới thiệu một phần điều hành.)

+0

Ah! "Lý do nó hoạt động về cơ bản là" bởi vì họ đã viết nó để làm việc như thế "". đó là những gì nó trông giống như! luqui để giải cứu, như mọi khi! cảm ơn –

+2

Cũng được mô tả tại [Báo cáo Haskell> Biểu thức> Phần] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-300003.5) –

0

(2 ^) tạo một hàm mới có tham số và yêu cầu (tham số 2 ^). Đó là một cách để làm tan chảy.

Dưới đây là một liên kết với các lý thuyết đằng sau nó: Partial Application(Haskell.org)

+0

đó không phải là khá những gì tôi yêu cầu trong bài gốc (tôi đoán tôi không rõ ràng). nhìn vào các câu trả lời khác. cảm ơn anyway –

+0

tôi thấy rằng ... xin lỗi vì không hiểu câu hỏi. –

3

Haskell biết rằng ^ là một nhà điều hành ghi để nó diễn giải (trong ký hiệu toán học) (2^) như f(x) = 2^x(^2) như f(x) = x^2.

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