我一直在努力研究如何在Scala中实现教会编码的数据类型。看起来它需要rank-n类型,因为您需要类型为forAll a. a -> (forAll b. b -> b)
的一流const
函数。闭包和通用量化
不过,我能正是如此编码对:
import scalaz._
trait Compose[F[_],G[_]] { type Apply = F[G[A]] }
trait Closure[F[_],G[_]] { def apply[B](f: F[B]): G[B] }
def pair[A,B](a: A, b: B) =
new Closure[Compose[({type f[x] = A => x})#f,
({type f[x] = B => x})#f]#Apply, Id] {
def apply[C](f: A => B => C) = f(a)(b)
}
对于名单,我能够编码cons
:
def cons[A](x: A) = {
type T[B] = B => (A => B => B) => B
new Closure[T,T] {
def apply[B](xs: T[B]) = (b: B) => (f: A => B => B) => f(x)(xs(b)(f))
}
}
然而,空列表是更多的问题,我已经无法让Scala编译器统一类型。
你可以定义nil吗?这样,给定上面的定义,下面的编译?
cons(1)(cons(2)(cons(3)(nil)))
这里有一个采取在斯卡拉Church数:HTTP:// jim- mcbeath.blogspot.com/2008/11/practical-church-numerals-in-scala.html – 2010-04-08 18:23:57
Randall:这些是类型级别的教堂数字。我正在做的不是类型的级别。 – Apocalisp 2010-04-08 19:34:06
对于它的价值,斯卡拉方法有效地给你排名n类型。 – Owen 2013-01-13 21:19:00