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.
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ó. " –
@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
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