Scalaz cung cấp một phương thức có tên fold
cho các ADT khác nhau như Boolean
, Option[_]
, Validation[_, _]
, Either[_, _]
v.v. Phương pháp này về cơ bản có chức năng tương ứng với tất cả các trường hợp có thể cho ADT đã cho. Nói cách khác, một mô hình phù hợp hiển thị dưới đây:Mối quan hệ của nếp gấp trên Tùy chọn, v.v. và gấp trên Traversable là gì?
x match {
case Case1(a, b, c) => f(a, b, c)
case Case2(a, b) => g(a, b)
.
.
case CaseN => z
}
tương đương với:
x.fold(f, g, ..., z)
Một số ví dụ:
scala> (9 == 8).fold("foo", "bar")
res0: java.lang.String = bar
scala> 5.some.fold(2 *, 2)
res1: Int = 10
scala> 5.left[String].fold(2 +, "[" +)
res2: Any = 7
scala> 5.fail[String].fold(2 +, "[" +)
res6: Any = 7
Cùng lúc đó, có một hoạt động với cùng tên cho các loại Traversable[_]
, di chuyển qua bộ sưu tập thực hiện một số thao tác nhất định trên các phần tử của nó và tích lũy giá trị kết quả. Ví dụ,
scala> List(2, 90, 11).foldLeft("Contents: ")(_ + _.toString + " ")
res9: java.lang.String = "Contents: 2 90 11 "
scala> List(2, 90, 11).fold(0)(_ + _)
res10: Int = 103
scala> List(2, 90, 11).fold(1)(_ * _)
res11: Int = 1980
Tại sao hai hoạt động này xác định với cùng tên - fold
/catamorphism? Tôi không thấy bất kỳ điểm tương đồng/quan hệ nào giữa hai người. Tôi đang thiếu gì?
Ồ, vì vậy nó phải được áp dụng đệ quy! Làm cho cảm giác, cảm ơn. – missingfaktor
[Trang Wikipedia về "catamorphism"] (http://en.wikipedia.org/wiki/Catamorphism) nói, "Trong lập trình chức năng, một catamorphism là một khái quát của các nếp gấp trên danh sách được biết đến từ lập trình chức năng cho dữ liệu đại số tùy ý loại có thể được mô tả như đại số ban đầu. " Sau đó nó chỉ vào giấy của Erik Meijer “Lập trình chức năng với Chuối, Ống kính, Phong bì và Dây thép gai”. Tôi nghĩ tôi nên đọc bài báo đó để hiểu rõ hơn về chủ đề. – missingfaktor
@missingfaktor, ở cuối trang wikipedia, có 6 phần blog trên catamorphism có vẻ rất dễ tiếp cận. Tôi đang đọc nó ngay bây giờ. Đó là F # nhưng tôi chắc chắn rằng đó sẽ không phải là một vấn đề cho bạn. – huynhjl