2014-05-21 17 views
5

Vì vậy, chỉ để contextualize này cho uninitiated (không nhất thiết phải loại trừ bản thân mình), functors là một lớp A bối cảnh/bản đồ trừu tượng. Trong Scalanese:Lập trình chung & Rotten Bananas trong Scala liên quan đến các phụ thuộc chức năng

trait FunctorStr[F[_]] { 
    def map[A, B](f: A => B): F[A] => F[B] 
} 

rất nhiều điều đang functors blah blah, bây giờ nếu bạn quan tâm đến chương trình chung và DSL crafting như một mẫu thiết kế functors đưa ra rất nhiều. Vì vậy, để phù hợp với chủ đề mở rộng trực giác, hãy tiếp tục với nó. Nửa chặng đường comonad.com's Rotten Bananas chúng tôi được giới thiệu đến lớp Cata

đưa ra trong Haskellese:

class Cata f t | t -> f where 
    cata:: (f a -> a) -> t -> a 

tại lớp này là gần đầu của những niềm vui đối với chúng tôi người đọc, nhưng đối với tôi những người thực hiện scala ... Cata là sự khởi đầu của sự cố của chúng tôi

phụ thuộc chức năng này t -> f có nghĩa là "f được xác định duy nhất bởi t"? nếu bạn hỏi Miles Sabin in 2011 mẫu fundep hoàn toàn có thể thực hiện được trong scala và chỉ đơn giản liên quan đến việc bắt đầu tìm kiếm tiềm ẩn thông qua phần tham số ẩn và chứng kiến ​​các loại để giải quyết tìm kiếm nhưng tôi không thể nói rằng tôi nhận được nó ngay lập tức dịch t -> f để scala

tôi nhìn thấy nó trong scala như một cái gì đó giống như

abstract class Cata[F[_], T](implicit e: ???) { 
    def cata[A]: (F[A] => A) => T => A 
} 

trait CataFunctor[F[_]] extends FunctorStr[({type l[x] = Cata[F, x]})#l] { 
    def map[A, B](f: A => B): Cata[F, A] => Cata[F, B] 
} 

Trích dẫn bài viết:

Cata nhất định và một fmap thể đi qua và xây dựng toàn bộ máy chủ của các đề án đệ quy khác, đa hình, zygomorphisms, histomorphisms, catamorphisms tổng quát, ...; các menagerie là khá cấm và này có thể được sử dụng để xé tan các functors biến đổi với thiếu thận trọng từ bỏ. Với sức mạnh của một sự đa hình bạn làm lại khái niệm của đệ quy chung, và do đó bạn về cơ bản có thể viết bất kỳ hàm đệ quy nào bạn muốn. (Về phía coalgebra của ngôi nhà có anamorphisms, apomorphisms, và tất cả các loại thú khác cho tạo ra hiệu quả functors hiệp biến)

Đây là sức mạnh tôi tìm kiếm.

Tôi đang cố gắng giải quyết vấn đề này và thực sự muốn trợ giúp? Bây giờ tôi đã thực hiện InvariantFunctor trong scalaz vì vậy tôi biết rằng đây không phải là một kẻ ngu ngốc.

Tôi có thể di chuyển đúng hướng ở đây không? Tôi xuống cho càng nhiều chi tiết càng tốt để như vậy, đi hạt.

Trả lời

2

Đọc bài đăng được liên kết có vẻ như bạn cần:

trait CataDep[T, F[_]] 

abstract class Cata[F[_], T](implicit e: CataDep[T, F]) { 
    def cata[A]: (F[A] => A) => T => A 
} 
Các vấn đề liên quan