2012-01-04 22 views
16

Tôi vẫn là người mới bắt đầu sử dụng haskell. Tôi có thể làm một bản đồ đôi trong haskell không?Bản đồ đôi trong haskell?

Ví dụ, nếu tôi có một [[Char]] và tôi muốn chuyển đổi mỗi Char trong mỗi [Char] để giảm trường hợp, là có một cách dễ dàng để làm điều này chứ không phải là cái gì đó như:

exampleF [] = [] 
exampleF (x:xs) = (map toLower x) : exampleF xs 
+0

nhớ: "@faq thể Haskell làm một bản đồ đôi? " Lambdabot: "Câu trả lời là: Có! Haskell có thể làm điều đó!" :) –

+0

Thật hữu ích khi lưu ý rằng bản đồ chính nó được định nghĩa trong Prelude "đuôi đệ quy" với cấu trúc giống như cái này ... ... về cơ bản bạn đã triển khai bản đồ mà không hề biết! ;) Theo như ngữ nghĩa Haskell, cách của bạn và câu trả lời được chấp nhận "làm" cùng một điều (cùng một điều chính xác, tôi nghĩ), chúng chỉ được viết khác nhau. Tuy nhiên, nói rằng "bản đồ bản đồ" chắc chắn là cách thanh lịch hơn. –

Trả lời

21

Bạn có thể nghĩ map f, khi chuyển một hàm f :: a -> b thành một hàm trên danh sách map f :: [a] -> [b], vì vậy nếu bạn muốn biến nó thành hàm trên danh sách danh sách, bạn chỉ cần sử dụng map lần nữa để nhận map (map f) :: [[a]] -> [[b]].

Trong trường hợp đặc biệt này, mà trở thành:

exampleF = map (map toLower) 
+3

'exampleF xss = map (\ xs -> map toLower xs) xss' - một cách khác để viết nó nếu nó làm cho bạn cảm thấy tốt hơn. Tuy nhiên, cách hammar viết nó được khuyến khích (vì nó là eta giảm và, trên thực tế, điểm miễn phí). Bạn sẽ quen với nó, nếu bạn chưa quen. –

21

Trong thực tế, có một mô hình đẹp ở đây:

map   :: (a -> b) -> [a] -> [b] 
(map.map)  :: (a -> b) -> [[a]] -> [[b]] 
(map.map.map) :: (a -> b) -> [[[a]]] -> [[[b]]] 

và vân vân

+0

tổng quát hơn: '(fmap. Fmap) :: (Functor m, Functor n) => (a -> b) -> m (n a) -> m (n b)' –

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