diff --git a/lib/ast.rb b/lib/ast.rb index 4531ebf5c0f95f622e37fa5e8b88c5d834120a51..38a54b049c5b261a0315438d1ff06852c2fdedf9 100644 --- a/lib/ast.rb +++ b/lib/ast.rb @@ -272,14 +272,15 @@ module Dhallish arg_type = @arg.compute_type ctx fn_type = @fn.compute_type ctx - if arg_type.is_a? Types::Type + assert("only functions can be called, not #{fn_type}") { fn_type.is_a? Types::Function } + + if arg_type.is_a? Types::Type and !fn_type.unres.nil? assert ("argument type mismatch: expected: #{fn_type.argtype}, got: #{arg_type}") { fn_type.argtype.is_a? Types::Type } - fn_type = Types::resolve(fn_type, fn_type.unres, arg_type.metadata) + Types::resolve(fn_type.restype, fn_type.unres, arg_type.metadata) else assert ("argument type mismatch: expected: #{fn_type.argtype}, got: #{arg_type}") { fn_type.argtype == arg_type } + fn_type.restype end - - fn_type.restype end def evaluate(ctx) diff --git a/lib/types.rb b/lib/types.rb index afa6f7fde7b2df86fd3c92ae12c277c31811dec5..587b1ff3929d599bcb808485f2bf0396485ac6cf 100644 --- a/lib/types.rb +++ b/lib/types.rb @@ -134,7 +134,11 @@ module Dhallish if orgtype.restype.nil? Function.new(resolve(orgtype.argtype, name, newtype), nil, orgtype.unres) else - Function.new(resolve(orgtype.argtype, name, newtype), resolve(orgtype.restype, name, newtype), orgtype.unres) + restype = orgtype.restype + if orgtype.unres.nil? or orgtype.unres != name + restype = resolve(orgtype.restype, name, newtype) + end + Function.new(resolve(orgtype.argtype, name, newtype), restype, orgtype.unres) end when Optional Optional.new(resolve(orgtype.type, name, newtype))