 			})
 	}
 
-	public func typecheck(environment: [Int: Value], _ against: Value) -> Either<Error, Value> {
+	public func typecheck(environment: Environment, _ against: Value) -> Either<Error, Value> {
 		return typecheck(environment)
 			.flatMap { t in
 				let (q, r) = (t.quote, against.quote)

			otherwise: const([]))
	}

	public func typecheck(_ environment: [Int: Value] = [:]) -> Either<Error, Value> {
		return expression.analysis(
			ifType: const(Either.right(.Type)),
			ifBound: { i -> Either<Error, Value> in


	// MARK: Evaluation

	public func evaluate(_ environment: Environment = [:]) -> Either<Error, Value> {
		return expression.analysis(
			ifType: const(Either.right(.Type)),
			ifBound: { i -> Either<Error, Value> in
