2011-01-09 4 views

ответ

6

Я никогда не слышал об этом. И есть только около пяти хитов в Google, один из которых - это самый вопрос, который, кажется, предлагает мне, что это составленные термины. И, как и с любым составленным термином, если вы хотите знать, что это значит, вы должны спросить того, кто его создал.

Из того, что я мог собрать, похоже, связано с перегрузкой на основе возвращаемого типа.

В принципе, если у вас есть четыре перегруженные функции, подобные этим:

foo :: string → int 
foo :: string → string 
foo :: string →() 
foo :: int → int 

И вы называете их, как это:

1 + foo 1 
1 + foo "one" 
foo "one" 

Затем с контекстно-зависимой перегрузкой (т.е. перегрузка на основе возвращения тип, а также типы параметров) будут выбраны следующие варианты:

1 + foo 1  # foo :: int → int 
1 + foo "one" # foo :: string → int (because `+` takes an `int`) 
foo "one"  # foo :: string →() (because there is no return value) 

Принимая во внимание, что с контекстно-независимой перегрузкой (т. игнорируя тип возвращаемого значения), будут выбраны следующие реализации:

1 + foo 1  # foo :: int → int 
1 + foo "one" # ERROR 
foo "one"  # ERROR 

В обоих ERROR случаях возникает неоднозначность между foo :: string → int, foo :: string → string и foo :: string →(), так как они отличаются только их тип возвращаемого значения, но имеют один и тот же paremeter тип.

0

Цитируя here:

Есть два вида перегрузки функций/операторов.

  • контекстно-независимый - перегрузки сделано только от параметров для функции или типа операндов для оператора
  • контекстно-зависимый - что абстракции для вызова также зависит от типа результата
Смежные вопросы