2016-08-11 17 views
8

Giả sử tôi muốn soạn Text.pack với Text.strip.Tại sao thành phần chức năng yêu cầu dấu ngoặc đơn?

:t (.) sản xuất: (b -> c) -> (a -> b) -> a -> c

:t (Text.pack) sản xuất: String -> Text

:t (Text.strip) sản xuất: Text -> Text

Vì vậy, thay strip cho (b -> c) cho: b = Text c = Text

Thay pack cho (a -> b) cho: a = String b = Text

Cho phép xác minh: :t strip . pack sản xuất: strip . pack :: String -> Text

ok, tuyệt vời cho phép thử nó:

strip.pack " example "

Tạo:

Couldn't match expected type ‘a -> Text’ with actual type ‘Text’ 
Relevant bindings include 
    it :: a -> Text (bound at <interactive>:31:1) 
Possible cause: ‘pack’ is applied to too many arguments 
In the second argument of ‘(.)’, namely ‘pack " example  "’ 
In the expression: strip . pack " example  " 

(strip . pack) " example " hoạt động như dự kiến ​​.... tại sao?

Trả lời

11

Ứng dụng chức năng có mức độ ưu tiên cao hơn so với bố cục.

strip.pack " example " tương đương với strip.(pack " example "). Đây là một lý do tại sao mọi người sử dụng $ để "ngăn chặn" ứng dụng cho đến khi sau khi tất cả các chức năng đã được bao gồm:

strip . pack $ " example  " 
+8

Thậm chí mạnh mẽ hơn, ứng dụng chức năng có mức độ ưu tiên cao hơn * mọi thứ khác *. – amalloy

+9

@amalloy ... ngoại trừ bản ghi cập nhật. = P –

+0

Ưu tiên này cho phép, ví dụ: 'lọc ngay cả. bản đồ (+5) '. Soạn các hàm được áp dụng một phần là khá thành ngữ. Cũng lưu ý rằng thứ tự của các đối số cho 'map, filter, ...' đã được chọn để làm cho việc này trở nên thuận tiện. – chi

1

ứng dụng Chức năng có độ ưu tiên cao hơn toán tử hàm hợp.

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