Ich habe versucht, herauszufinden, wie Church-codierte Datentypen in Scala implementiert werden. Es scheint, dass es Rang-n-Typen erfordert, da Sie eine erstklassige const
-Funktion des Typs forAll a. a -> (forAll b. b -> b)
benötigen.Verschlüsse und universelle Quantifizierung
aber ich in der Lage war Paare zu kodieren thusly:
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)
}
Für Listen, ich war in der Lage zu kodieren 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))
}
}
jedoch die leere Liste ist problematischer und ich habe nicht in der Lage, den Scala-Compiler zu bekommen, um die Typen zu vereinheitlichen.
Können Sie Nil definieren, so dass die folgenden Kompilierungen gemäß der obigen Definition vorliegen?
cons(1)(cons(2)(cons(3)(nil)))
Hier ist ein Nehmen auf Kirche Zahlen in Scala: http: // jim- mcbeath.blogspot.com/2008/11/practical-church-numerals-in-scala.html –
Randall: Das sind Typ-Ebene Kirchenziffern. Was ich tue, ist nicht auf der Ebene der Typen. – Apocalisp
Für was es wert ist, geben Scala-Methoden effektiv Rang-Typen. – Owen