2013-09-21 31 views
5

Tôi đã cố gắng xác định Monad (scalaz) cho shapeless HList thông qua pointbind 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

+2

Đ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). –

+0

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

+1

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

Trả lời

0

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 _0Succ[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 đó?

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