2015-01-09 19 views
6

Tôi đang đọc một tác phẩm của Bartosz Milewski trong đó ông định nghĩa các chức năng sau:

instance Applicative Chan where 
    pure x = Chan (repeat x) 
    (Chan fs) <*> (Chan xs) = Chan (zipWith ($) fs xs) 

Tại sao là ứng dụng hàm operator trong ngoặc? Tôi hiểu điều này thường được thực hiện để sử dụng chức năng infix ở dạng ký hiệu tiền tố, nhưng tôi không hiểu tại sao, trong trường hợp này, hàm không thể đơn giản chỉ được biểu thị là Chan (zipWith $ fs xs) và tự hỏi sự khác biệt giữa hai là.

(nếu bạn vẫn cần bối cảnh, tham khảo các article)

+1

Nó sẽ được bất kỳ đơn giản hơn nếu nó được viết là 'Chan (zipWith id fs xs)'? Nó chính xác giống như thực hiện hiện tại. – Carl

+0

Hãy nhớ rằng '($)' không phải là một toán tử nguyên thủy huyền diệu: nó là một hàm giống như '(+)' và 'hoặc'. – AJFarmar

Trả lời

13

Trong trường hợp này, $ đang được thông qua vào-zipWith. Nó giống như viết

zipWith (\ f x -> f x) fs xs 

Nếu không có dấu ngoặc đơn, nó đã có tương đương với

zipWith (fs xs) 

đó sẽ không typecheck.

Toán tử trong dấu ngoặc đơn hoạt động chính xác như số nhận dạng thông thường. Với định nghĩa sau đây:

apply = ($) 

mã có thể trông giống như

zipWith apply fs xs 
+2

Cụ thể, ngữ pháp của haskell yêu cầu bạn phải nói 'zipWith ', trong đó '' là một biểu thức. '($)' là toán tử infix '$' được chuyển thành một biểu thức *, có một chút khác biệt so với "tiền tố được chuyển đổi" và cho phép cả hai sử dụng như một hàm tiền tố và cách sử dụng làm đối số cho các hàm khác. –

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