2013-07-08 29 views
9

Tôi đang học haskell và hơi bối rối về cách mà toán tử ứng dụng hàm $ curry's.

Theo GHC loại $ là

*Main>:t ($) 
($) :: (a->b) -> a -> b 

Nhưng tôi có thể gõ đoạn mã sau

*Main>map ($ 2) [(*2), (+2), (/2)] 
[4.0,4.0,1.0] 

Theo chữ ký của $ mặc dù tôi sẽ giả định tôi sẽ cần phải sử dụng lật bởi vì tham số đầu tiên của $ là (a-> b).

Ví dụ, tôi không thể làm như sau

curry_test :: Integer -> String -> String 
curry_test x y = (show x) ++ " " ++ y 
*Main> let x = curry_test "123" 
    Couldn't match expected type `Integer' with actual type `[Char]' 
In the first argument of `curry_test', namely `"123"' 
In the expression: curry_test "123" 
In an equation for `x': x = curry_test "123" 

Nhưng tôi có thể làm

let x = curry_test 2 
+0

gợi ý: '(*) :: Num a => a -> a -> a' – DiegoNolan

Trả lời

11

khai thác Infix có những quy định đặc biệt. Xem trang này: http://www.haskell.org/haskellwiki/Section_of_an_infix_operator

Về cơ bản, vì $ là một nhà điều hành ghi, ($ 2) thực sự sửa chữa 2 như là đối số thứ hai của $, vì vậy nó tương đương với flip ($) 2. Ý tưởng là tạo một phần ứng dụng với các toán tử trực quan hơn, ví dụ nếu bạn map (/ 2) trên danh sách, bạn có thể tưởng tượng đặt từng phần tử của danh sách vào vị trí "thiếu" ở phía bên trái của dấu phân chia.

Nếu bạn muốn sử dụng chức năng curry_test bạn theo cách này, bạn có thể làm

let x = (`curry_test` "123") 
Các vấn đề liên quan