Tôi thực sự quan tâm đến việc tìm ra sự khác biệt ở đâu, và nói chung, để xác định các trường hợp sử dụng kinh điển trong đó không thể sử dụng HLists (hay nói đúng hơn là không mang lại bất kỳ lợi ích nào trong danh sách thông thường).
(Tôi biết rằng có 22 (tôi tin) TupleN
ở Scala, trong khi người ta chỉ cần một HList duy nhất, nhưng đó không phải là loại khác biệt về khái niệm mà tôi quan tâm.)
Tôi đã đánh dấu một vài câu hỏi trong văn bản dưới đây. Có thể không thực sự cần thiết phải trả lời chúng, chúng có ý nghĩa hơn để chỉ ra những điều không rõ ràng với tôi và hướng dẫn cuộc thảo luận theo những hướng nhất định.
Động lực
Gần đây tôi đã thấy một vài câu trả lời trên SO nơi mọi người đề xuất sử dụng HLists (ví dụ, được cung cấp bởi Shapless ), bao gồm cả câu trả lời đã bị xóa cho câu hỏi này . Nó đã dẫn đến cuộc thảo luận này , từ đó đặt ra câu hỏi này.
Giới thiệu
Dường như với tôi, danh sách đó chỉ hữu ích khi bạn biết số lượng phần tử và loại chính xác của chúng một cách tĩnh. Con số thực sự không quan trọng, nhưng có vẻ như bạn không cần phải tạo một danh sách với các yếu tố khác nhau nhưng được biết chính xác về mặt tĩnh, nhưng bạn không biết rõ về số của chúng. Câu hỏi 1: Bạn thậm chí có thể viết một ví dụ như vậy, ví dụ, trong một vòng lặp? Trực giác của tôi là việc có một danh sách chính xác tĩnh với số lượng phần tử tùy ý không xác định (tùy ý liên quan đến hệ thống phân cấp lớp nhất định) không tương thích.
HLists so với Tuples
Nếu điều này là đúng, tức là, bạn hoàn toàn biết số và loại - Câu hỏi 2: tại sao không chỉ sử dụng một n-tuple? Chắc chắn, bạn có thể lập bản đồ một cách dễ dàng và gấp lại một HList (mà bạn cũng có thể, nhưng không phải là một cách dễ dàng, thực hiện trên một tuple với sự trợ giúp của productIterator
), nhưng vì số lượng và loại của các phần tử được biết đến một cách tĩnh mà bạn có thể chỉ cần truy cập vào các phần tử tuple trực tiếp và thực hiện các hoạt động.
Mặt khác, nếu chức năng f
bạn ánh xạ trên một danh sách chung chung đến mức nó chấp nhận tất cả các yếu tố - Câu hỏi 3: tại sao không sử dụng nó thông qua productIterator.map
? Ok, một sự khác biệt thú vị có thể đến từ quá tải phương thức: nếu chúng ta có một số quá tải f
, việc có thông tin loại mạnh hơn được cung cấp bởi danh sách (ngược lại với ProductIterator) có thể cho phép trình biên dịch chọn cụ thể hơn f
. Tuy nhiên, tôi không chắc liệu điều đó có thực sự hoạt động trong Scala hay không, vì các phương thức và chức năng không giống nhau.
HLists và đầu vào của người dùng
Dựa trên cùng một giả định, cụ thể là bạn cần biết số lượng và loại yếu tố một cách tĩnh - Câu hỏi 4: danh sách có thể được sử dụng trong các tình huống mà các yếu tố phụ thuộc vào bất kỳ loại tương tác người dùng nào không? Ví dụ, hãy tưởng tượng điền vào một danh sách với các phần tử bên trong một vòng lặp; các yếu tố được đọc từ đâu đó (UI, tệp cấu hình, tương tác diễn viên, mạng) cho đến khi một điều kiện nhất định được giữ. Loại của danh sách sẽ là gì? Tương tự đối với một đặc tả giao diện getElements: HList [...] sẽ hoạt động với các danh sách có độ dài không xác định tĩnh và cho phép thành phần A trong hệ thống có được danh sách các phần tử tùy ý từ thành phần B.