анонимные функции и перегруженные методы в F # - PullRequest
5 голосов
/ 19 февраля 2012

Итак, если вы хотите записать строку на консоль в F #, вы делаете следующее:

System.Console.WriteLine "foo"

Первоначально я думал, что следующее было в значительной степени идентично, просто более многословно, но на самом деле этовыдает ошибку «Уникальная перегрузка для метода« WriteLine »не может быть определена на основе информации о типе до этой программной точки»:

(fun line -> System.Console.WriteLine line) "foo"

Кажется, вторая версия смущена наличием перегруженных методов WriteLineкоторые принимают строку, а также другие аргументы.Правильно ли мое предположение?

1 Ответ

12 голосов
/ 19 февраля 2012

Не совсем.В первом случае вызов функции знает, что он применяется к строковому литералу, поэтому он может выполнить разрешение перегрузки, чтобы найти перегрузку строки.

Во втором случае line является нерешенной переменной типа длявывод типа в точке вызова перегруженного метода WriteLine, поэтому он не знает, какую перегрузку выбрать, и еще не видел строковый аргумент, так как вывод типа слева направо.

Измените его на

"foo" |> (fun line -> System.Console.WriteLine line)

, и оно будет работать, потому что переменная вывода типа для line будет объединена с string из входящего "foo", до он должен определить вызов WriteLine.

Таким образом, они вводятся слева направо;в отсутствие решения для переменной типа, возможно, еще не удастся выбрать перегрузку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...