Вызов функции SML не анализирует аргументы как аргументы - PullRequest
0 голосов
/ 17 апреля 2009

Я получаю то, что кажется проблемой приоритета при вызове функции SML, замените:

fun substitute v new (typevar q) = ...

И я вызываю это из другой функции:

fun new_type_vars (typevar v) non_gens = 
                   substitute v new_var() (typevar v)

Но я получаю ошибку:

    C:/sml/type_checker.sml:22.48-23.44 Error: operator and operand don't agree [tycon mismatch]
      operator domain: type_exp
      operand:         unit -> string
      in expression:
        (substitute v) new_var

Что, по-видимому, предполагает, что он пытается вызвать (заменить v), а затем вызвать результат этого вызова с аргументом new_var.

Я пытался добавить круглые скобки вокруг всего этого, но это не помогает, и когда я добавляю круглые скобки вокруг аргументов, таких как (v new_var...), он думает, что v является приложением-функцией в new_var. Что происходит с этим вызовом функции?

Ответы [ 2 ]

1 голос
/ 17 апреля 2009

Вы, вероятно, хотите изменить

substitute v new_var() (typevar v)

до

substitute v (new_var()) (typevar v)

(ответ Бутты объясняет почему.)

1 голос
/ 17 апреля 2009

Я не все понимаю, так как вы не указываете все типы различных операций и переменных.

Но основная проблема, с которой вы столкнулись, заключается в том, что, как вы уже догадались, SML выполняет вызовы функций (и связывает переменные) с левой стороны. Вот пример:

fun f a:int b:int c:string = ...

f, таким образом, является функцией типа int -> int -> string -> ... и неявно добавляет скобки fun (((fa: int) b: int) c: int) = ...

Это означает, что вы можете использовать его, например, так:

var f2 = f 3;

И теперь f2 имеет тип int -> string -> ...

...