Read Lambda types and expressions.
type_ : String -> Result Lambda.Error Lambda.Type
Reads a Lambda type from a text representation.
import Lambda exposing (Type(..))
import Lambda.Read
-- Builtin types
Lambda.Read.type_ "@Int" --> Ok IntType
Lambda.Read.type_ "@Num" --> Ok NumType
-- Named types
Lambda.Read.type_ "T" --> Ok (Type "T")
-- Abstraction types
Lambda.Read.type_ "A->B" --> Ok (AbsType (Type "A") (Type "B"))
Lambda.Read.type_ "A -> B -> C" --> Ok (AbsType (Type "A") (AbsType (Type "B") (Type "C")))
Lambda.Read.type_ "(A -> B) -> C" --> Ok (AbsType (AbsType (Type "A") (Type "B")) (Type "C"))
Lambda.Read.type_ "( A -> B ) -> C" --> Ok (AbsType (AbsType (Type "A") (Type "B")) (Type "C"))
-- Invalid types
Lambda.Read.type_ "->A" |> Result.toMaybe --> Nothing
expression : String -> Result Lambda.Error Lambda.Expr
Reads a Lambda expression from a text representation.
import Lambda exposing (Expr(..))
import Lambda.Read
-- Values
Lambda.Read.expression "42" --> Ok (Int 42)
Lambda.Read.expression "3.14" --> Ok (Num 3.14)
-- Variables
Lambda.Read.expression "x" --> Ok (Var "x")
-- Abstractions
Lambda.Read.expression "λx.y" --> Ok (Abs "x" (Var "y"))
Lambda.Read.expression "λx.λy.z" --> Ok (Abs "x" (Abs "y" (Var "z")))
-- Applications
Lambda.Read.expression "f x" --> Ok (App (Var "f") (Var "x"))
Lambda.Read.expression "f x y" --> Ok (App (App (Var "f") (Var "x")) (Var "y"))
Lambda.Read.expression "f (x y)" --> Ok (App (Var "f") (App (Var "x") (Var "y")))
Lambda.Read.expression "λx.y z" --> Ok (Abs "x" (App (Var "y") (Var "z")))
Lambda.Read.expression "(λx.y) z" --> Ok (App (Abs "x" (Var "y")) (Var "z"))
-- Variable definitions (syntax sugar)
Lambda.Read.expression "x=y; z" --> Ok (App (Abs "x" (Var "z")) (Var "y"))