2010-03-02 45 views
9

Nếu công trình này:Haskell chức năng thành phần câu hỏi

Prelude Data.Char> map toUpper ("sdfsd" ++ "dfgfdg") 
"SDFSDDFGFDG" 

Sau đó, tại sao điều này không?

Prelude Data.Char> map toUpper . (++) "sdfsd" "dfgfdg" 

<interactive>:1:14: 
    Couldn't match expected type `a -> [Char]' 
      against inferred type `[Char]' 
    In the second argument of `(.)', namely `(++) "sdfsd" "dfgfdg"' 
    In the expression: map toUpper . (++) "sdfsd" "dfgfdg" 
    In the definition of `it': it = map toUpper . (++) "sdfsd" "dfgfdg" 
+1

Ưu tiên người vận hành. Ứng dụng chức năng "liên kết" rất chặt chẽ; (.) liên kết rất yếu. – jrockway

+0

'(.)' Liên kết rất chặt chẽ (ưu tiên = 9), nhưng ứng dụng hàm liên kết chặt chẽ hơn (ưu tiên = 10). Chỉ cần chèn '$' giữa hai chuỗi để sửa nó. '$' có mức ưu tiên rất thấp, ** 0 **. –

Trả lời

13
map toUpper . (++) "sdfsd" "dfgfdg" 

được phân tách như:

(map toUpper) . ((++) "sdfsd" "dfgfdg") 

Vì vậy, về cơ bản bạn đang làm

(map toUpper) . "sdfsddfgfdg" 

này không làm việc vì đối số thứ hai để . nhu cầu trở thành một chức năng, không phải là một chuỗi.

Tôi cho rằng bạn đang cố gắng làm điều gì đó giống như (map toUpper . (++)) "sdfsd" "dfgfdg". Điều này cũng không hoạt động vì loại trả lại của ++[a] -> [a] trong khi loại đối số của map toUpper[a]. Điều này ở đây là trong khi người ta có thể nghĩ rằng ++ là một hàm có hai danh sách và trả về một danh sách, nó thực sự là một hàm nhận danh sách và sau đó trả về một hàm nhận danh sách khác và trả về một danh sách. Để có được những gì bạn muốn, bạn cần phải ++ vào một hàm lấy một bộ gồm hai danh sách và trả về một danh sách. Đó được gọi là uncurrying. Các công trình sau đây:

map toUpper . (uncurry (++)) $ ("sdfsd", "dfgfdg") 
+5

Theo lời giải thích của bạn, '(bản đồ toUpper. (++) "sdfsd") "dfgfdg"' nên thực hiện công việc. Và nó có. Cảm ơn. – artemave

+1

Và thông báo lỗi bây giờ có ý nghĩa. Cảm ơn một lần nữa. – artemave

7

Bạn muốn $ thay vì .: map toUpper $ (++) "sdfsd" "dfg" công trình và làm những gì bạn muốn. Lý do cho điều này là $ là một ứng dụng chức năng có mức ưu tiên rất thấp, vì vậy phiên bản đã sửa sẽ được đọc là: "Áp dụng hàm map toUpper cho kết quả của (++) "sdfsd" "dfg"".

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