tôi nghĩ rằng nó có lẽ là giải pháp ít thanh lịch nhất được đề xuất, nhưng vì lợi ích của sự hoàn chỉnh, nên thêm rằng những điều như vậy nên có thể với Templa te Haskell.
Đây là thực tế được đề cập trong những gì tôi nghĩ là giấy gốc Template Haskell (Tìm kiếm zipn trong văn bản): http://research.microsoft.com/en-us/um/people/simonpj/Papers/meta-haskell/meta-haskell.pdf
Nhưng tôi nghĩ rằng mã không bao giờ thực tế làm việc, thấy điều này: http://www.haskell.org/pipermail/template-haskell/2003-July/000126.html (lát mẫu không được triển khai).
đó đã không được thực hiện vào năm 2003, nhưng nó vẫn không được thực hiện ngày hôm nay: http://www.haskell.org/ghc/docs/7.6.1/html/users_guide/template-haskell.html (mẫu lát không được hỗ trợ)
Tuy nhiên có một thực hiện zipWithN sử dụng mẫu Haskell: http://www.haskell.org/haskellwiki/Template_Haskell#zipWithN
Tôi có đã xác minh rằng nó hoạt động với chương trình thử nghiệm này:
{-# LANGUAGE TemplateHaskell #-}
import Zipn
main = do
let l1 = [1,2,3]
let l2 = [5,6,7]
let l3 = [7,4,8]
print $ $(zipWithN 3) (,,) l1 l2 l3
Trong mô-đun Zipn, tôi đã dán zipn, chỉ cần đổi tên thành zipWithN cho c larity (và nhớ thêm TemplateHaskell pragma ở phía trên). Lưu ý rằng N thực tế bị bẻ khóa hai lần ở đây, bởi vì tôi đã phải cung cấp (,,)
làm hàm "with". Bạn sẽ phải thay đổi số lượng dấu phẩy tùy thuộc vào N.
(,,)
là viết tắt của \a b c -> (a,b,c)
Tôi đoán một ai đó với mẫu tốt kỹ năng Haskell (mà không phải là trường hợp của tôi vào thời điểm này) có thể làm cho một zipN thẳng sử dụng Template Haskell.
Đây là hàm zip3. –
Có, 'zip3' là để nén 3 danh sách. –