Mogensen–Scott encoding
In computer science, Scott encoding is a way to represent algebraic data types in the lambda calculus, following their syntactic definition without regard whether they are recursive or not. This is unlike Church encoding which treats recursive data types specially, representing them with right folds. The data and operators form a mathematical structure which is embedded in the lambda calculus.
Mogensen–Scott encoding extends and slightly modifies Scott encoding by applying the encoding to Metaprogramming[citation needed]. This encoding allows the representation of lambda calculus terms, as data, to be operated on by a meta program.
Exposition
[edit]Numbers
[edit]Scott encoding of numbers follows the Peano definition of natural numbers as a sum of two cases, the zero case and the successor case,
Correspondingly, Scott numerals are functions which expect two arguments, two handlers, each receiving the corresponding case data from the number:
The zero case has no data. The successor case data is its Scott numeral, which is served as the argument to the corresponding handler.
When a Scott numeral is supplied with two handlers, it calls the appropriate one with its corresponding data. Scott encoded values perform a choice between the sum data type cases.
Recursive operations on Scott numerals require explicit use of recursion, e.g. using combinator:
Church numerals, on the other hand, already embody the primitive recursion and perform the folding / looping on their own:
The key difference is that Scott's handler's argument is the number's own predecessor Scott numeral, unprocessed, whereas Church's folding / looping function's argument is the result of folding / looping over its predecessor.
Lists
[edit]Scott encoding of lists follows their definition as a sum of two cases, the empty list case and the cons case,
Correspondingly, Scott lists are functions which expect two arguments, two handlers, each receiving the corresponding data from the list:
The empty list case has no data. The cons case data are the head element and the list's tail, which are served as the arguments to the corresponding handler.
When a Scott list is supplied with two handlers, it calls the appropriate one with its corresponding data. Scott encoded values perform a choice between the sum data type cases.
Recursive operations on Scott lists require explicit use of recursion, e.g. using combinator:
Church lists, on the other hand, already embody the primitive recursion and perform the folding on their own:
The key difference is that Scott's handler's second argument is the list's own tail, unprocessed, which is also a Scott list, whereas Church's folding function's second argument is the result of folding over its tail.
This is the argument that corresponds to the recursive datum in the data type definition. There are no differences between the two encodings in the other, non-recursive data fields, except possibly in the corresponding arguments' order.
History
[edit]Scott encoding appears first in a set of unpublished lecture notes by Dana Scott[1] whose first citation occurs in the book Combinatorial Logic, Volume II.[2] Michel Parigot gave a logical interpretation of and strongly normalizing recursor for Scott-encoded numerals,[3] referring to them as the "Stack type" representation of numbers. Torben Mogensen later extended Scott encoding for the encoding of Lambda terms as data.[4]
Discussion
[edit]Lambda calculus allows data to be stored as parameters to a function that does not yet have all the parameters required for application. For example,
May be thought of as a record or struct where the fields have been initialized with the values . These values may then be accessed by applying the term to a function f. This reduces to,
c may represent a constructor for an algebraic data type in functional languages such as Haskell. Now suppose there are N constructors, each with arguments;
Each constructor selects a different function from the function parameters . This provides branching in the process flow, based on the constructor. Each constructor may have a different arity (number of parameters). If the constructors have no parameters then the set of constructors acts like an enum; a type with a fixed number of values. If the constructors have parameters, recursive data structures may be constructed.
Definition
[edit]Let D be a datatype with N constructors, , such that constructor has arity .
Scott encoding
[edit]The Scott encoding of constructor of the data type D is
Mogensen–Scott encoding
[edit]Mogensen extends Scott encoding to encode any untyped lambda term as data. This allows a lambda term to be represented as data, within a Lambda calculus meta program. The meta function mse converts a lambda term into the corresponding data representation of the lambda term;
The "lambda term" is represented as a tagged union with three cases:
- Constructor a - a variable (arity 1, not recursive)
 - Constructor b - function application (arity 2, recursive in both arguments),
 - Constructor c - lambda-abstraction (arity 1, recursive).
 
For example,
Comparison to the Church encoding
[edit]The Scott encoding coincides with the Church encoding for booleans. Church encoding of pairs may be generalized to arbitrary data types by encoding of D above as[citation needed]
compare this to the Mogensen Scott encoding,
With this generalization, the Scott and Church encodings coincide on all enumerated datatypes (such as the boolean datatype) because each constructor is a constant (no parameters).
Concerning the practicality of using either the Church or Scott encoding for programming, there is a symmetric trade-off:[5] Church-encoded numerals support a constant-time addition operation and have no better than a linear-time predecessor operation; Scott-encoded numerals support a constant-time predecessor operation and have no better than a linear-time addition operation.
Type definitions
[edit]Church-encoded data and operations on them are typable in system F, as are Scott-encoded data and operations. However, the encoding is significantly more complicated.[6]
The type of the Scott encoding of the natural numbers is the positive recursive type:
Full recursive types are not part of System F, but positive recursive types are expressible in System F via the encoding:
Combining these two facts yields the System F type of the Scott encoding:
This can be contrasted with the type of the Church encoding:
The Church encoding is a second-order type, but the Scott encoding is fourth-order!
See also
[edit]Notes
[edit]- ^ Scott, Dana (1968) [1962]. A system of functional abstraction. Lectures delivered at University of California, Berkeley.
 - ^ Curry, Haskell (1972). Combinatorial Logic, Volume II. North-Holland Publishing Company. ISBN 0-7204-2208-6.
 - ^ Parigot, Michel (1988). "Programming with proofs: A second order type theory". In H. Ganzinger (ed.). European Symposium on Programming: ESOP '88. 2nd European Symposium on Programming. Nancy, France, March 21–24, 1988. Lecture Notes in Computer Science. Vol. 300. Springer. pp. 145–159. doi:10.1007/3-540-19027-9_10. ISBN 978-3-540-19027-1.
 - ^ Mogensen, Torben (1994). "Efficient Self-Interpretation in Lambda Calculus". Journal of Functional Programming. 2 (3): 345–364. doi:10.1017/S0956796800000423. S2CID 8736707.
 - ^ Parigot, Michel (1990). "On the representation of data in lambda-calculus". In Egon Börger; Hans Kleine Büning; Michael M. Richter (eds.). International Workshop on Computer Science Logic: CSL '89. 3rd Workshop on Computer Science Logic. Kaiserslautern, FRG, October 2-6, 1989. Lecture Notes in Computer Science. Vol. 440. Springer. pp. 209–321. doi:10.1007/3-540-52753-2_47. ISBN 978-3-540-52753-4.
 - ^ See the note "Types for the Scott numerals" by Martín Abadi, Luca Cardelli and Gordon Plotkin (February 18, 1993).
 
References
[edit]- Stump, A. (2009). Directly reflective meta-programming. Higher-Order and Symbolic Computation, 22, 115-144.
 - Mogensen, T.Æ. (1992). Efficient Self-Interpretations in lambda Calculus. J. Funct. Program., 2, 345-363.