 	public var debugDescription: String {
 		return analysis(
 			ifType: const("Type"),
+			ifConstant: { "\(toDebugString($0)) : \(toDebugString($1))" },
 			ifFree: toDebugString,
-			ifConstant: { "\(toDebugString($0)) : \(toDebugString($1))" },
 			ifPi: { "(Π ? : \(toDebugString($0)) . \(toDebugString($1)))" },
 			ifSigma: { "(Σ ? : \(toDebugString($0)) . \(toDebugString($1)))" })
 	}


	public func analysis<T>(
		@noescape #ifType: () -> T,
		@noescape ifFree: Name -> T,
		@noescape ifConstant: (Any, Value) -> T,
		@noescape ifPi: (Value, Value -> Either<Error, Value>) -> T,
		@noescape ifSigma: (Value, Value -> Either<Error, Value>) -> T) -> T {
		switch self {


	public func analysis<T>(
		ifType: (() -> T)? = nil,
		ifConstant: ((Any, Value) -> T)? = nil,
		ifFree: (Name -> T)? = nil,
		ifPi: ((Value, Value -> Either<Error, Value>) -> T)? = nil,
		ifSigma: ((Value, Value -> Either<Error, Value>) -> T)? = nil,
		@noescape otherwise: () -> T) -> T {
		return analysis(
			ifType: { ifType?() ?? otherwise() },
			ifConstant: { ifConstant?($0) ?? otherwise() },
			ifFree: { ifFree?($0) ?? otherwise() },
			ifPi: { ifPi?($0) ?? otherwise() },
			ifSigma: { ifSigma?($0) ?? otherwise() })
	}
