He estado tratando de encontrar la manera de implementar los tipos de datos codificados por Church en Scala. Parece que requiere tipos rango-n ya que necesitaría una función de primera clase const
del tipo forAll a. a -> (forAll b. b -> b)
.Cierres y cuantificación universal
Sin embargo, yo era capaz de codificar pares de esta manera:
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)
}
Para listas, yo era capaz de codificar 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))
}
}
Sin embargo, la lista vacía es más problemática y he No se ha podido obtener el compilador de Scala para unificar los tipos.
¿Se puede definir nil, para que, dada la definición anterior, las siguientes compilaciones?
cons(1)(cons(2)(cons(3)(nil)))
Aquí hay una sola toma en números Iglesia en Scala: http: // jim- mcbeath.blogspot.com/2008/11/practical-church-numerals-in-scala.html –
Randall: Esos son números de iglesia de nivel de tipo. Lo que estoy haciendo no está en el nivel de tipos. – Apocalisp
Por lo que vale, los métodos de Scala le otorgan efectivamente rango n tipos. – Owen