Tôi đã cố gắng xác định Monad
(scalaz) cho shapeless HList
thông qua point
và bind
triển khai. Vấn đề đầu tiên là đặc điểm HList
không phải là kiểu hàm dựng, nhưng có thể được giải quyết bằng kiểu lambdas, point
là đơn giản, nhưng tôi không thể tìm được cách thực hiện đúng cho bind
, tôi đoán tôi cần một số chức năng kiểu Poly1
với một số thủ thuật Aux/Mapper
, nhưng mặt bất lực đó vẫn còn tối với tôi. HList
có tất cả các chức năng để trở thành một Monad, như Danh sách đơn giản, do đó, có thể thực hiện một từ Scalaz không?Xác định trường hợp đơn vị scalaz cho danh sách không có hình dạng
Trả lời
Monoid là tập hợp với một số thao tác tuân theo luật cụ thể. Bạn đang xem xét những yếu tố nào nhất có thể HListM[A]
? Nếu bạn khai báo HListM[A] = HList
, tức là bất kỳ HList
, thì bạn sẽ nhanh chóng thấy rằng bạn không thể map
với f: A => B
, ngoại trừ bằng cách xử lý tất cả map
s làm identity
và bạn đã tạo lại một đơn vị khá thú vị Id
(với một vài người bổ sung nhưng trơ).
Chúng ta có thể làm cho một đơn nguyên với kiểu HListM[A] = A :: ... :: A :: HNil
(mặc dù thậm chí thực sự bày tỏ rằng gõ vào Scala là một thách thức - bạn cần một đặc điểm phụ trợ trait CopiesOf[N <: Nat, A] {type Out <: HList
}, implicit
s để cung cấp các trường hợp này, và sau đó là một hiện sinh để thực sự viết nó (CopiesOf[N, A]#Out forSome {type N <: Nat}
)). Việc viết các thao tác đơn lẻ cho điều này là có thể, mặc dù bạn cần phải yêu cầu các lớp phụ trợ không may như Prepend
tại thời điểm hoạt động, vì không có cách nào thực sự thể hiện kiểu "forall" trong Scala - bạn có thể khai báo các kiểu của bạn cho _0
và Succ[N]
, nhưng không có cách nào để chứng minh cho trình biên dịch rằng có một cá thể cho bất kỳ N <: Nat
nào, bạn chỉ cần yêu cầu những trình ẩn ngữ bất cứ khi nào bạn cần sử dụng chúng.
Nhưng sau rất nhiều công việc, bạn sẽ kết thúc với một cái gì đó không đồng nhất với List[A]
; tại sao không chỉ sử dụng List[A]
cho trường hợp đó?
- 1. scalaz xác nhận và danh sách đơn nguyên
- 2. Cột không xác định 'giá trị2' trong 'danh sách trường'
- 3. Cột không xác định trong Danh sách trường. PHP + Mysql
- 4. Làm phẳng xác nhận hợp lệ Scalaz
- 5. Có phải hành vi không xác định trong trường hợp gọi hàm riêng trong danh sách khởi tạo không?
- 6. Giải thích Traverse [Danh sách] thực hiện trong scalaz bảy
- 7. "App_GlobalResources" không tải trong trường hợp kiểm tra Đơn vị
- 8. Định dạng mô hình MVC Trường TimeSpan
- 9. Lấy định dạng đơn vị tiền tệ cho quốc gia không có hằng số Locale
- 10. Cột Giáo lý không tìm thấy: 1054 Cột không xác định 's.features' trong 'danh sách trường' '
- 11. Cách tạo danh sách trường theo dạng django
- 12. Không thể xác định vị trí Microsoft.Office.Interop.Word trong Danh sách tham khảo
- 13. Máy phát hiện trường hợp thử nghiệm đơn vị
- 14. Có danh sách các loại trường cho mô hình Sencha Touch không?
- 15. Soạn xác nhận Scalaz
- 16. Cách xác định danh sách các danh sách trong Scala?
- 17. Python danh sách định dạng từ mysqldb
- 18. "Cột không xác định trong 'danh sách trường'", nhưng cột không tồn tại
- 19. Scalaz xác nhận
- 20. Xác định thứ tự của danh sách
- 21. Haskell Danh sách Concatenation vs (đầu: đuôi) định dạng
- 22. MySQL: Cột không xác định trong trường hợp lỗi số
- 23. Tìm giữa danh sách kích thước không xác định
- 24. Chuỗi.Định dạng cho làm tròn, không thể định vị lỗi nguồn chuyển đổi định dạng bất hợp pháp?
- 25. Làm cách nào để xác định xem danh sách có chỉ là một chuỗi hoặc danh sách các chuỗi không?
- 26. Thêm một mô hình có thể xác định được vào bài kiểm tra đơn vị
- 27. Tại sao Danh sách Scala không có trường kích thước?
- 28. XCode 4 Kiểm tra đơn vị: Có thể bỏ qua một số trường hợp thử nghiệm nhất định không?
- 29. GADT cho danh sách đa hình
- 30. Định dạng danh sách văn bản thành các cột
Điều này là không thể theo nghĩa đơn giản, nhưng đó là một câu hỏi thú vị. Xem ví dụ [câu trả lời của tôi ở đây] (http://stackoverflow.com/a/14456938/334519) (liên quan đến functors ứng dụng thay vì monads), [ví dụ liên quan này] (https://github.com/milessabin/shapeless/ blob/master/examples/src/main/scala/shapeless/ví dụ/cartesianproduct.scala) trong Shapeless, và câu hỏi của tôi (chưa được trả lời) [ở đây] (https://twitter.com/travisbrown/status/294064540235210752). –
ScalaZ vẫn là lãnh thổ chưa được thám hiểm đối với tôi, nhưng điều này có thể chứa các phương pháp và khả năng tương tác mà bạn cần: [Shapeless Contrib] (https://github.com/typelevel/shapeless-contrib) – EECOLOR
mandubian (http://stackoverflow.com/ người dùng/601296/mandubian) đã viết một bài đăng blog về một monoid cho HList: http://mandubian.com/2014/07/29/hmonoid/, điều đó có thể khiến bạn quan tâm. – al3xar