phân tích của bạn, loại hệ thống scala sẽ từ chối String như không phải là một "loại kinded cao" * -> * đúng. Đó là, các kiểu String là không thể chuyển nhượng để F[_]
cho bất kỳ F. Bạn có thể thử (tôi đã không kiểm tra này) chuyển đổi tiềm ẩn ...
def foo[A, F[_], That](implicit mon: Monoid[F[A]], pr: Pure[F], FA_Is_That: F[A] <%< That)
... nhưng điều này sẽ không thể là tôi hữu ích nghi ngờ bởi vì bạn sẽ phải cung cấp các chuyển đổi riêng biệt của riêng bạn khi cần thiết nhưng cũng bởi vì hiệu suất sẽ là khủng khiếp, giả sử đây là một phần nóng của mã.
Hoặc, sử dụng thư viện tiêu chuẩn, bạn có thể sử dụng các máy móc CanBuildFrom
nhưng nó xa rõ ràng như thế nào độc đáo này sẽ kết hợp với typeclasses scalaz kiểu.
def foo[A, F[_], That](implicit mon: Monoid[F[A]], pr: Pure[F], b: CanBuildFrom[A, F[A], That]): That
Trong cơ thể của phương pháp này, tất nhiên, bạn sẽ cần phải sử dụng trình tạo để xây dựng các giá trị trả về, như trái ngược với/typeclasses tinh khiết monoid, khiến họ phần nào không cần thiết, tôi nghi ngờ.
Nguồn
2011-10-03 07:14:48
Tại sao bạn cần Monoid [F [A]] thay vì chỉ Monoid [F]? – CheatEx
@CheatEx, trong trường hợp này, tôi không phải là người viết 'foo', tôi chỉ là người gọi. – huynhjl