2011-09-23 51 views
6

Với ngôn ngữ lập trình ghép ấp đi kèm với yesod, cách tốt nhất để in danh sách được phân cách bằng dấu phẩy là gì?Làm cách nào để in danh sách được phân tách bằng dấu phẩy bằng ấp?

Ví dụ: giả sử mã này chỉ in một mục nhập khác, làm cách nào để chèn dấu phẩy vào giữa các phần tử? Hoặc thậm chí có thể thêm một “và” trước sự xâm nhập lần cuối:

The values in the list are 
$ forall entry <- list 
    #{entry} 
and that is it. 

Một số ngôn ngữ khuôn mẫu như Template Toolkit cung cấp chỉ thị để phát hiện phiên đầu tiên hoặc cuối cùng.

Trả lời

5

Tôi không nghĩ có bất kỳ thứ gì được tích hợp sẵn như vậy. May mắn thay, thật dễ dàng để sử dụng các hàm trợ giúp trong Hamlet. Ví dụ: nếu các mục của bạn là các chuỗi đơn giản, bạn chỉ có thể sử dụng Data.List.intercalate để thêm dấu phẩy giữa chúng.

The values in the list are 
#{intercalate ", " list} 
and that is it. 

Nếu bạn muốn làm những điều huyền ảo hơn, bạn có thể viết các chức năng để làm việc với các giá trị Hamlet. Ví dụ, đây là một hàm bổ sung dấu phẩy và "và" giữa các giá trị Hamlet trong một danh sách.

commaify [x] = x 
commaify [x, y] = [hamlet|^{x} and ^{y}|] 
commaify (x:xs) = [hamlet|^{x}, ^{commaify xs}|] 

Cú pháp này chèn giá trị Hamlet vào giá trị khác. Bây giờ, chúng ta có thể sử dụng điều này để viết một danh sách được phân tách bằng dấu phẩy của các từ được gạch dưới.

The values in the list are 
^{commaify (map underline list)} 
and that is it. 

Ở đây, underline chỉ là một chức năng trợ giúp nhỏ để tạo nội dung thú vị hơn văn bản thuần túy.

underline word = [hamlet|<u>#{word}|] 

Khi kết xuất, điều này sẽ cho kết quả như sau.

The values in the list are <u>foo</u>, <u>bar</u> and <u>baz</u> and that is it. 
+0

Cảm ơn, tôi đoán đó là tập hợp các giải pháp tốt, mặc dù không thỏa mãn như những gì mà Template Haskell cung cấp. Có lẽ tôi phải gửi một bản vá cho một biến '' 'loop''' đặc biệt cho ấp. –

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