 
 	var hashValue: Int {
 		return cata {
-			return $0.map { $0.hashValue }
-				.analysis(
-					ifUnit: { 1 },
-					ifUnitType: { 2 },
-					ifType: { 3 ^ $0 },
-					ifVariable: { 5 ^ $0.hashValue },
-					ifApplication: { 7 ^ $0 ^ $1 },
-					ifLambda: { 11 ^ $0 ^ $1 ^ $2 },
-					ifProjection: { 13 ^ $0 ^ $1.hashValue },
-					ifProduct: { 17 ^ $0 ^ $1 },
-					ifBooleanType: { 19 },
-					ifBoolean: { 23 ^ $0.hashValue },
-					ifIf: { 29 ^ $0 ^ $1 ^ $2 },
-					ifAnnotation: { 31 ^ $0 ^ $1 })
+			$0.map { $0.hashValue }.analysis(
+				ifUnit: { 1 },
+				ifUnitType: { 2 },
+				ifType: { 3 ^ $0 },
+				ifVariable: { 5 ^ $0.hashValue },
+				ifApplication: { 7 ^ $0 ^ $1 },
+				ifLambda: { 11 ^ $0 ^ $1 ^ $2 },
+				ifProjection: { 13 ^ $0 ^ $1.hashValue },
+				ifProduct: { 17 ^ $0 ^ $1 },
+				ifBooleanType: { 19 },
+				ifBoolean: { 23 ^ $0.hashValue },
+				ifIf: { 29 ^ $0 ^ $1 ^ $2 },
+				ifAnnotation: { 31 ^ $0 ^ $1 })
 		} (Recur(self))
 	}
 }

				.flatMap { _ in
					body.typecheck(environment + [ .Local(i): type ])
						.map { Expression.lambda(Recur(type), const(Recur($0))) }
			}

		case let .Product(a, b):
			return (a.typecheck(environment) &&& b.typecheck(environment))

				ifProduct: Expression.Product,
				ifIf: Expression.If,
				otherwise: const(t)))
		} (Recur(self)).out
	}


