add(t1: Repr[Int], t2: Repr[Int]): Repr[Int] } ରݴޠΛઃܭ͢Δ n is an integer n : Z <latexit sha1_base64="aqTjJRpsuHiTjvolHIL1iUnYxkc=">AAAClXichVHLShxBFD22STSThxNdKLhpHAxZDXdMwCAIohLc+RyVODJUtzVjYXd1010zqE3/QD4gWWSlEIL4C9mFiD+QhZ8QsjSQTRa53dMQEklym646de49t05VOaGnYkN01Wf137p9Z2Dwbune/QcPh8qPhjfjoBO5su4GXhBtOyKWntKybpTx5HYYSeE7ntxyDhay/FZXRrEK9IY5CuWuL9patZQrDFPNMjX2WpFwE203jDw0ia1iW2hbaSPbMkpTTszYDV+YfcdJXqZpqVmuUJXysG+CWgEqKGIlKL9HA3sI4KIDHxIahrEHgZi/HdRACJnbRcJcxEjleYkUJdZ2uEpyhWD2gMc2r3YKVvM66xnnapd38fiPWGljkj7TGV3TJZ3TF/rx115J3iPzcsSz09PKsDn0amz9+39VPs8G+79U//Rs0MLz3Kti72HOZKdwe/ru8Zvr9Zm1yeQxndJX9n9CV/SRT6C739x3q3LtLbIHqP153TfB5lS19rQ6tfqsMjdfPMUgxjGBJ3zf05jDElZQ531f4wM+4cIatWatRetFr9TqKzQj+C2s5Z/yAZyG</latexit> e1 : Z e2 : Z e1 + e2 : Z <latexit sha1_base64="EQqF3aFNjRqdenwIiwdw5Lz7pWE=">AAACqHichVHLSiNBFD326IwTdczoRnDTGJRBIVTHgZGsRDcu4yPGR6Sp7lRiY7/srgScJj/gD7hw5YCI+Blu3LkamHyCuHRgNi683WlQR9RbVNWtU+fcOlVl+LYVSsY6PcqH3r6Pn/o/ZwYGh74MZ7+OrIdeMzBF2fRsL9gweChsyxVlaUlbbPiB4I5hi4qxtxjvV1oiCC3PXZMHvthxeMO16pbJJUF6drFaqwfcjISuqUW16nC5axjRVlut7u83eU0VeqH4iLZj3kyMPaG29WyO5VkS6stES5Mc0ih52TNUUYMHE004EHAhKbfBEVLbhgYGn7AdRIQFlFnJvkAbGdI2iSWIwQndo7FBq+0UdWkd1wwTtUmn2NQDUqqYZL/ZObtjV+yC3bD7V2tFSY3YywHNRlcrfH34cGz137sqh2aJ3UfVm54l6phLvFrk3U+Q+BZmV9/6eXS3WlyZjKbYL3ZL/k9Yh13SDdzWX/N0WawcI0MfoP3/3C+T9UJem80Xlr/n5hfSr+jHOCbwjd77B+axhBLKdO45rvEHHWVaKSkVZbNLVXpSzSiehWI8AA4Yo7E=</latexit> e ::= n | e + e <latexit sha1_base64="BnNsj3R8j7NTot2dpjzNjA9F+qc=">AAACinichVFNSxtBGH5ctU1XrVEvBS9DQ6SghEksqAkF0R48JmpUcCXsrqMO2S92N4EY/AP2B/TQk4KI9ORVj176Bzz4E8SjghcPvrtZECvqu+zM8z7zPu88M2N4lgxCzq+6lO6e3g8fU5/Uvv6Bz4PpoeGVwG34pqiaruX6a4YeCEs6ohrK0BJrni9027DEqlGfj9ZXm8IPpOsshy1PbNj6tiO3pKmHRNXSWcGKxR9sTCs5TNNUxphmy80o1yYEG48GVVVr6QzP8TjYS5BPQAZJlN30MTRswoWJBmwIOAgJW9AR0LeOPDg84jbQJs4nJON1gT2opG1QlaAKndg6jduUrSesQ3nUM4jVJu1i0e+TkiHLL/kJv+X/+F9+zR9e7dWOe0ReWjQbHa3waoP7X5bu31XZNIfYeVK96TnEFqZjr5K8ezETncLs6Ju7v2+XiovZ9hg/5Dfk/4Bf8Qs6gdO8M48qYvEPogfI/3/dL8FKIZefzBUq3zOzc8lTpDCKr/hG9z2FWSygjCrt+wunOMO50q8UlBml1ClVuhLNCJ6F8vMRh1OStw==</latexit> ߏจ (syntax) ܕ͚نଇ (typing rules) දݱ͍ͨ͠ରݴޠ Symantics
add(t1: Repr[Int], t2: Repr[Int]): Repr[Int] } ରݴޠΛઃܭ͢Δ n is an integer n : Z <latexit sha1_base64="aqTjJRpsuHiTjvolHIL1iUnYxkc=">AAAClXichVHLShxBFD22STSThxNdKLhpHAxZDXdMwCAIohLc+RyVODJUtzVjYXd1010zqE3/QD4gWWSlEIL4C9mFiD+QhZ8QsjSQTRa53dMQEklym646de49t05VOaGnYkN01Wf137p9Z2Dwbune/QcPh8qPhjfjoBO5su4GXhBtOyKWntKybpTx5HYYSeE7ntxyDhay/FZXRrEK9IY5CuWuL9patZQrDFPNMjX2WpFwE203jDw0ia1iW2hbaSPbMkpTTszYDV+YfcdJXqZpqVmuUJXysG+CWgEqKGIlKL9HA3sI4KIDHxIahrEHgZi/HdRACJnbRcJcxEjleYkUJdZ2uEpyhWD2gMc2r3YKVvM66xnnapd38fiPWGljkj7TGV3TJZ3TF/rx115J3iPzcsSz09PKsDn0amz9+39VPs8G+79U//Rs0MLz3Kti72HOZKdwe/ru8Zvr9Zm1yeQxndJX9n9CV/SRT6C739x3q3LtLbIHqP153TfB5lS19rQ6tfqsMjdfPMUgxjGBJ3zf05jDElZQ531f4wM+4cIatWatRetFr9TqKzQj+C2s5Z/yAZyG</latexit> e1 : Z e2 : Z e1 + e2 : Z <latexit sha1_base64="EQqF3aFNjRqdenwIiwdw5Lz7pWE=">AAACqHichVHLSiNBFD326IwTdczoRnDTGJRBIVTHgZGsRDcu4yPGR6Sp7lRiY7/srgScJj/gD7hw5YCI+Blu3LkamHyCuHRgNi683WlQR9RbVNWtU+fcOlVl+LYVSsY6PcqH3r6Pn/o/ZwYGh74MZ7+OrIdeMzBF2fRsL9gweChsyxVlaUlbbPiB4I5hi4qxtxjvV1oiCC3PXZMHvthxeMO16pbJJUF6drFaqwfcjISuqUW16nC5axjRVlut7u83eU0VeqH4iLZj3kyMPaG29WyO5VkS6stES5Mc0ih52TNUUYMHE004EHAhKbfBEVLbhgYGn7AdRIQFlFnJvkAbGdI2iSWIwQndo7FBq+0UdWkd1wwTtUmn2NQDUqqYZL/ZObtjV+yC3bD7V2tFSY3YywHNRlcrfH34cGz137sqh2aJ3UfVm54l6phLvFrk3U+Q+BZmV9/6eXS3WlyZjKbYL3ZL/k9Yh13SDdzWX/N0WawcI0MfoP3/3C+T9UJem80Xlr/n5hfSr+jHOCbwjd77B+axhBLKdO45rvEHHWVaKSkVZbNLVXpSzSiehWI8AA4Yo7E=</latexit> e ::= n | e + e <latexit sha1_base64="BnNsj3R8j7NTot2dpjzNjA9F+qc=">AAACinichVFNSxtBGH5ctU1XrVEvBS9DQ6SghEksqAkF0R48JmpUcCXsrqMO2S92N4EY/AP2B/TQk4KI9ORVj176Bzz4E8SjghcPvrtZECvqu+zM8z7zPu88M2N4lgxCzq+6lO6e3g8fU5/Uvv6Bz4PpoeGVwG34pqiaruX6a4YeCEs6ohrK0BJrni9027DEqlGfj9ZXm8IPpOsshy1PbNj6tiO3pKmHRNXSWcGKxR9sTCs5TNNUxphmy80o1yYEG48GVVVr6QzP8TjYS5BPQAZJlN30MTRswoWJBmwIOAgJW9AR0LeOPDg84jbQJs4nJON1gT2opG1QlaAKndg6jduUrSesQ3nUM4jVJu1i0e+TkiHLL/kJv+X/+F9+zR9e7dWOe0ReWjQbHa3waoP7X5bu31XZNIfYeVK96TnEFqZjr5K8ezETncLs6Ju7v2+XiovZ9hg/5Dfk/4Bf8Qs6gdO8M48qYvEPogfI/3/dL8FKIZefzBUq3zOzc8lTpDCKr/hG9z2FWSygjCrt+wunOMO50q8UlBml1ClVuhLNCJ6F8vMRh1OStw==</latexit> ߏจ (syntax) ܕ͚نଇ (typing rules) දݱ͍ͨ͠ରݴޠ Symantics Repr
final case class Unknown[A](x: sym.Repr[A]) extends Term[A] final case class IntLit(e: Int) extends Term[Int] final case class Add(e1: Term[Int], e2: Term[Int]) extends Term[Int] type Repr[T] = Term[T] trait AddSym { type Repr[T] def int(n: Int): Repr[Int] def add(t1: Repr[Int], t2: Repr[Int]): Repr[Int] }
FS) { sealed trait Term[T] final case class Unknown[A](x: sym.Repr[A]) extends Term[A] final case class IntLit(e: Int) extends Term[Int] final case class Add(e1: Term[Int], e2: Term[Int]) extends Term[Int] object AddRR extends RR { override type From[T] = sym.Repr[T] override type To[T] = Term[T] def fwd: From ~> To = new (From ~> To) { def apply[A](x: sym.Repr[A]): Term[A] = Unknown(x) } def bwd: To ~> From = new (To ~> From) { def apply[A](term: Term[A]): sym.Repr[A] = term match { case Unknown(x) => x case IntLit(n) => sym.int(n) case Add(e1, e2) => sym.add(bwd(e1), bwd(e2)) } } } ...
FS) { sealed trait Term[T] final case class Unknown[A](x: sym.Repr[A]) extends Term[A] final case class IntLit(e: Int) extends Term[Int] final case class Add(e1: Term[Int], e2: Term[Int]) extends Term[Int] object AddRR extends RR { override type From[T] = sym.Repr[T] override type To[T] = Term[T] def fwd: From ~> To = new (From ~> To) { def apply[A](x: sym.Repr[A]): Term[A] = Unknown(x) } def bwd: To ~> From = new (To ~> From) { def apply[A](term: Term[A]): sym.Repr[A] = term match { case Unknown(x) => x case IntLit(n) => sym.int(n) case Add(e1, e2) => sym.add(bwd(e1), bwd(e2)) } } } ...
FS) { sealed trait Term[T] final case class Unknown[A](x: sym.Repr[A]) extends Term[A] final case class IntLit(e: Int) extends Term[Int] final case class Add(e1: Term[Int], e2: Term[Int]) extends Term[Int] object AddRR extends RR { override type From[T] = sym.Repr[T] override type To[T] = Term[T] def fwd: From ~> To = new (From ~> To) { def apply[A](x: sym.Repr[A]): Term[A] = Unknown(x) } def bwd: To ~> From = new (To ~> From) { def apply[A](term: Term[A]): sym.Repr[A] = term match { case Unknown(x) => x case IntLit(n) => sym.int(n) case Add(e1, e2) => sym.add(bwd(e1), bwd(e2)) } } } ... R.Repr AddIdent(R).Repr MulIdent(AddIdent(R)) .Repr From To From To
2009. Finally tagless, partially evaluated: Tagless staged interpreters for simpler typed languages. J. Funct. Program. 19, 5 (September 2009), 509-543. • [2] Miller, Dale & Nadathur, Gopalan (1987) A logic programming approach to manipulating formulas and programs. In IEEE Symposium on Logic Programming, Seif Haridi (ed). Washington, DC: IEEE Comp. Society Press, pp. 379–388. • [3] Pfenning, Frank & Elliott, Conal (1988) Higher-order abstract syntax. In PLDI 88: Proceedings of the ACM Conference on Programming Language Design and Implementation. ACM SIGPLAN Notices, vol. 23(7). New York: ACM, pp. 199–208. • [4] Kenichi Suzuki, Oleg Kiselyov, and Yukiyoshi Kameyama. 2016. Finally, safely-extensible and efficient language-integrated query. PEPM '16. ACM, New York, NY, USA, 37-48. • [5] Per Martin-Löf. About models for intuitionistic type theories and the notion of definitional equality. In Proceedings of the Third Scandinavian Logic Symposium (1972), volume 82 of Studies in Logic and the Foundation of Mathematics, pages 81–109. North-Holland, 1975. • [6] Olivier Danvy and Andrzej Filinski. Abstracting control. In Mitchell Wand, editor, Proceedings of the 1990 ACM Conference on Lisp and Functional Programming, pages 151–160, Nice, France, June 1990. ACM Press • [7] Peter Dybjer and Andrzej Filinski. Normalization and partial evaluation. In Gilles Barthe, Peter Dybjer, Luís Pinto, and João Saraiva, editors, Applied Semantics – Advanced Lectures, number 2395 in Lecture Notes in Computer Science, pages 137–192, Caminha, Portugal, September 2000. Springer-Verlag.