2015-04-17 20 views
5

Websocket snippet có một tuyên bố rằng có ký hiệu đô la bên trong dấu ngoặc đóng như thế này,Dollar dấu bên trong dấu ngoặc đóng

any ($ fst client) 

Kể từ haskellers sử dụng $ dấu hiệu thay vì dấu ngoặc, tại sao chúng ta cần dấu ngoặc ở đây?

Tại sao có biểu tượng $ giữa các lần chia tách?

tôi đã cố gắng để xem nếu $ là một chức năng bằng cách làm

Prelude>:t $ 

Nhưng nó đã ném lỗi, parse error on input $

+2

'3. LỢI NHUẬN !!!! – leppie

Trả lời

12

Trong Haskell, các toán tử chỉ là các hàm bình thường có tên được tạo thành từ các biểu tượng và được sử dụng theo mặc định. Bạn có thể sử dụng chúng giống như một định danh bình thường bằng cách gói chúng trong ngoặc đơn:

λ> :t (+) 
(+) :: Num a => a -> a -> a 

$ chỉ là một nhà điều hành như bản thân này. Nó đại diện cho ứng dụng chức năng và được định nghĩa như sau:

f $ x = f x 

Bạn có thể nhận dạng của nó giống như (+):

λ> :t ($) 
($) :: (a -> b) -> a -> b 

khai thác Haskell cũng có thể được áp dụng một phần như các chức năng bình thường, bao bì của họ trong ngoặc với đối số cho một bên. Ví dụ: (+ 1) giống với \ x -> x + 1(1 +) giống với \x -> 1 + x.

Điều này cũng áp dụng cho $ quá, vì vậy ($ fst client) cũng giống như \ f -> f $ fst client hoặc chỉ \ f -> f (fst client). Đoạn mã bạn đã kiểm tra nếu bất kỳ của danh sách hàm nào trả về true là fst client.

+4

Có thể đáng lưu ý rằng các loại ứng dụng một phần này được gọi là các phần. – Sarah

3

($ fst client) là một phần điều hành (giống như (+ 1) hoặc (* 2)) - nó phần nào áp dụng toán tử đến toán hạng bên phải của nó. Một cách tiết kiệm hơn để viết nó sẽ là (\f -> f $ fst client).

Vì vậy, bạn đang áp dụng any cho hàm có chức năng khác và áp dụng hàm đó cho đối số fst client.

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