Tôi đã cố gắng tìm hiểu cách triển khai các kiểu dữ liệu được mã hóa của Giáo Hội trong Scala. Có vẻ như nó đòi hỏi các loại rank-n vì bạn sẽ cần một hàm const
hạng nhất của loại forAll a. a -> (forAll b. b -> b)
.Đóng cửa và định lượng phổ quát
Tuy nhiên, tôi đã có thể mã hóa cặp 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)
}
Đối với danh sách, tôi đã có thể mã hóa 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))
}
}
Tuy nhiên, danh sách rỗng là có vấn đề hơn và tôi đã không thể có được trình biên dịch Scala để thống nhất các loại.
Bạn có thể xác định không, do đó, với định nghĩa ở trên, các bản dịch sau đây?
cons(1)(cons(2)(cons(3)(nil)))
Dưới đây là một lần quay về chữ số Giáo Hội tại Scala: http: // jim- mcbeath.blogspot.com/2008/11/practical-church-numerals-in-scala.html –
Randall: Đó là những chữ số của giáo hội cấp loại. Những gì tôi đang làm không phải ở cấp độ các loại. – Apocalisp
Đối với những gì nó có giá trị, phương pháp Scala có hiệu quả cung cấp cho bạn thứ hạng n loại. – Owen