Scalaz는 Boolean
, Option[_]
, Validation[_, _]
, Either[_, _]
등과 같이 다양한 ADT에 대해 fold
이라는 메서드를 제공합니다.이 메서드는 기본적으로 주어진 ADT에 대한 모든 가능한 경우에 해당하는 함수를 사용합니다. 즉, 패턴 매칭이 아래 :옵션에서 접기, 둘 중 하나 등의 관계는 무엇이며 트래 버블에서 접기는 무엇입니까?
x.fold(f, g, ..., z)
일부 예 :
x match {
case Case1(a, b, c) => f(a, b, c)
case Case2(a, b) => g(a, b)
.
.
case CaseN => z
}
는 동등하다 동시에
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
동일한 함께 동작 존재 Traversable[_]
유형의 이름으로 요소에서 특정 작업을 수행하는 모음을 탐색하고 결과 값을 누적합니다. fold
/catamorphism - 예를 들어,
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
왜이 두 작업은 동일한 이름으로 식별? 나는 두 사람 사이에 어떤 유사점이나 관계를 보지 못한다. 내가 뭘 놓치고 있니?
아, 재귀 적으로 적용해야합니다! 고마워, 고마워. – missingfaktor
[catamorphism에 대한 위키 피 디아 페이지] (http://en.wikipedia.org/wiki/Catamorphism)는 "기능 프로그래밍에서 기능 변형 프로그래밍에서 임의의 대수 데이터로 알려진 목록의 폴드를 일반화 한 것입니다 초기 대수 (algebras)로 기술 할 수있는 유형 "이라고 설명했다. 그런 다음 Erik Meijer의 논문 "바나나, 렌즈, 봉투 및 철조망을 이용한 기능 프로그래밍"을 설명합니다. 주제에 대해 더 잘 이해할 수 있도록이 신문을 읽어야한다고 생각합니다. – missingfaktor
@missingfaktor, 위키 피 디아 페이지의 끝 부분에는 매우 접근하기 쉬운 것으로 보이는 반증에 관한 6 부분 블로그가 있습니다. 나는 지금 그것을 읽고있다. 그것은 F #이야하지만 당신에게 문제가되지 않을 것이라고 확신합니다. – huynhjl