2014-10-23 15 views
6

Tôi có nhiệm vụ lấy cột từ ma trận [[a]].Cách thực hiện nhiều lần cắt giảm trong Haskell

Một giải pháp đơn giản sẽ là

colFields :: Int -> [[a]] -> [a] 
colFields n c = map (!! n) c 

và khi giảm một mức độ trừu tượng nó sẽ là

colFields n = map (!! n) 

Tôi cảm thấy rằng tôi có thể thoát khỏi n dễ dàng, nhưng tôi không thể làm đi.

Trả lời

13

gì bạn đang tìm kiếm là

colFields = map . flip (!!) 

Tuy nhiên, đây không phải là rất rõ ràng để đọc, tôi muốn rời khỏi tham số n trong đó. Với thông số n là một tham số rõ ràng, tôi hiểu ngay lập tức chức năng đó thực hiện những gì. Không có nó, tôi phải suy nghĩ trong một phút để hiểu định nghĩa, ngay cả đối với một trường hợp đơn giản như thế này.

tôi đắc câu trả lời này rất đơn giản bằng cách sử dụng công cụ pointfree, mặc dù có những phương pháp để phát sinh này bằng tay.

+2

Tôi đồng ý rằng nó không phải là siêu rõ ràng và phiên bản quan trọng là thích hợp hơn. Tôi đã tìm ra nó bằng tay; Đây là con đường suy nghĩ của tôi: "Tôi ước mình đã cài đặt' pointfree'. '(!!) :: [a] -> Int -> a'. Nếu tôi nhận được' Int' là tham số đầu tiên tôi có thể tạo nó với '(.)'. Đó là những gì 'flip' là cho. Hãy hỏi 'ghci':': t lật (!!) ';': t bản đồ. flip (!!) '. Điều đó có vẻ tốt. Oh darn, @bheklilr đánh tôi với nó. " –

+2

@ChristianConkle Để công bằng tôi chỉ cần sao chép/dán mã vào GHCi đã mở của tôi với ': pf' được thiết lập để gọi công cụ' pointfree'. Một khi tôi thấy đề xuất giảm, tôi nghĩ rằng "Oh yeah, bạn phải sử dụng' flip' trên '(!!)' để lấy 'n' được tiêu thụ trước, sau đó chuyển kết quả đó tới' map' bằng '(.) '. Tôi hiểu được phiên bản miễn phí, nhưng nó không phải là không có một chút nỗ lực nào. Phiên bản quan trọng là ngay lập tức rõ ràng với tôi (có lẽ tôi viết quá nhiều Haskell ...) – bheklilr

+3

Một chút nerding ở đây ... 'flip (!!) :: Int -> [a] -> a' một hàm tự nhiên hơn từ quan điểm ứng dụng một phần so với' (!!) ', trong đó thứ tự đối số là dành cho mục đích ký hiệu. Có lẽ tôi sẽ gọi nó là' index'. Và trong trường hợp đó 'map. index' là tốt, nhưng tôi đồng ý' map. flip (!!) 'là một chút phức tạp để đọc như là-is. – luqui

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