在《本质标量》一书中,他们有一个使用泛型/类型表示树的例子。
我困惑的是,说这是一棵树。因此,左/右值是节点,并且该值属于Int.类型
为什么折叠的类型参数必须是B而不是A?我很困惑为什么有两种类型A和B,而不仅仅是类型A,如果它是树[Int],它就是Int。
sealed trait Tree[A] {
def fold[B](node: (B, B) => B, leaf: A => B): B
}
final case class Node[A](left: Tree[A], right: Tree[A]) extends Tree[A] {
def fold[B](node: (B, B) => B, leaf: A => B): B =
node(left.fold(node, leaf), right.fold(node, leaf))
}
final case class Leaf[A](value: A) extends Tree[A] {
def fold[B](node: (B, B) => B, leaf: A => B): B =
leaf(value)
}
Fold是一个将F[A]
减少为单个值B
的操作。
当然,您可以将Int
的树缩减为单个Int
(通过将整数相加,即(,在这种情况下,A
和B
是相同的。
但折叠可以为你做更多的事情。例如,您还可以将树折叠为String以打印其结构。
Fold比您预期的更通用。