 private let prototypeArgs = %(.Character("(")) *> many(identifier) <* %(.Character(")"))
 
 /// prototype ::= Identifier prototypeArgs
-private let prototype = PrototypeExpression.init <^> ( lift(pair) <*> identifier <*> prototypeArgs )
+private let prototype = curry(PrototypeExpression.init) <^> identifier <*> prototypeArgs
 
 /// definition ::= "def" prototype expression
-private let definition: TopLevelExpressionParser = FunctionExpression.init <^> ( %(Token.Def) *> lift(pair) <*> prototype <*> valueExpression )
+private let definition: TopLevelExpressionParser = %(Token.Def) *> (curry(FunctionExpression.init) <^> prototype <*> valueExpression)
 
 /// external ::= "extern" prototype
 private let external: TopLevelExpressionParser = id <^> ( %(Token.Extern) *> prototype )

    let callargs = %(.Character("(")) *> many(valueExpression) <* %(.Character(")"))
    
    /// call ::= Identifier callargs
    let call: ValueExpressionParser = CallExpression.init <^> ( lift(pair) <*> identifier <*> callargs )
    
    /// primary
    ///     ::= call

    ])
    
    /// infixRight ::= infixOperator primary
    let infixRight = curry(pair) <^> infixOperator <*> primary
    
    /// infix ::= primary infixRight*
    let repackedInfix = curry(map(id, ArraySlice.init)) <^> primary <*> many(infixRight)
    let infix: ValueExpressionParser = collapsePackedInfix <^> repackedInfix
    
    /// valueExpression
