2013-05-02 38 views
6

Là một newbie để Haskell Tôi không thể hiểu tại sao các biểu head . words “one two three four” ném một thành phần ngoại lệ và chức năng head . words phải được áp dụng với $ điều hành - sự biểu hiện ở bên phải của nó không cần đánh giá thêm vì nó chỉ là một đơn String. Cách khác để biên dịch nó là đặt head . words trong dấu ngoặc đơn nhưng (head . words) :: String -> String có cùng loại với head . words :: String -> String vậy tại sao đặt nó trong dấu ngoặc đơn làm cho biểu thức biên dịch?Áp dụng đối số thực hiện chức năng thành phần trong Haskell

Trả lời

11

Vì các quy tắc ưu tiên. Ứng dụng có quyền ưu tiên cao nhất; $ - thấp nhất.

head . words “one two three four” được phân tích cú pháp là head . (words “one two three four”) tức là words được áp dụng trên chuỗi phải tạo hàm (theo yêu cầu của (.)). Nhưng đó không phải là loại mà words có:

Prelude> :t words 
words :: String -> [String] 

head . words $ “one two three four” mặt khác, được phân tách như (head . words) “one two three four” và các loại phù hợp.

+0

Cảm ơn câu trả lời, có một chút khó khăn khi tôi hiểu rằng toán tử thành phần chính là một hàm. –

+2

@wojtek ah, vâng, '(.) :: (b -> c) -> (a -> b) -> a -> c'. Đừng quên, các mũi tên trong chữ ký kiểu liên kết bên phải. Nó thực sự là '(.) :: (b -> c) -> (a -> b) -> (a -> c)'. Hãy tưởng tượng bạn đã có hai đường ống này, 'g :: b-> c' và' h :: a-> b'. Vì vậy, rõ ràng, đầu ra 'b' đi vào đầu vào' b': '(g.h) x = g (h x)' tức là '(g.h) :: a-> c'. –

+1

@wojtek Mỗi toán tử đều là một hàm và có mức ưu tiên thấp hơn ứng dụng hàm. Đây là thứ mà một lập trình viên Haskell hoàn toàn phải lưu ý. – Ingo

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