F # Способы помочь вывести вывод?

В Эксперт F # 2.0 Дона Сима, Адама Гранича и Антонио Чистернино, стр. 44

Ввод типа: с помощью оператора | > можно ввести поток информации из вводят объекты в функции, управляющие этими объектами. F # использует информация, полученная из вывода типа для разрешения какого-либо языка конструкций, таких как доступ к свойствам и перегрузка метода. Эта опирается на распространяемую информацию слева направо, тщательный текст программы. В частности, введите информацию справа от позиции не учитывается при разрешении доступа и перегрузки свойств.

Так ясно, что использование | > может помочь сделать вывод типа.

Как всегда, объявление типа также полезно.

Существуют ли какие-либо другие средства/тактики, которые могут использоваться для вывода вывода F #?

ИЗМЕНИТЬ

Как правильно указал RamonSnir, предполагается, что один из них предполагает, что вывод типа делает как можно больше работы. Таким образом, добавление объявлений типов только потому, что вы можете это не то, что нужно делать. Не принимайте этот вопрос или ответы как нечто, что нужно сделать. Я задал вопрос, чтобы помочь лучше понять нюанс вывода типа и что может помочь в тех случаях, когда запрос типа нуждается в помощи. Поэтому, если вывод типа может разрешить все типы без помощи, то не давайте его, но когда это произойдет, было бы неплохо узнать некоторые способы помочь ему.

Ответ 1

Несколько точек:

1) Предпочитаете модульные функции для свойств и методов.

List.map (fun x -> x.Length) ["hello"; "world"] // fails
List.map String.length ["hello"; "world"] // works

let mapFirst xss = Array.map (fun xs -> xs.[0]) xss // fails
let mapFirst xss = Array.map (fun xs -> Array.get xs 0) xss // works

2) Предпочитают методы без перегрузки. Например, Помощники QuickLinq определяют неперегруженные члены, чтобы избежать связывания аннотаций типа в методах расширения LINQ.

3) Используйте любую доступную информацию, чтобы дать подсказки для проверки типов.

let makeStreamReader x = new System.IO.StreamReader(x) // fails
let makeStreamReader x = new System.IO.StreamReader(path=x) // works

Последний пример взят из превосходной записи о вывода типа F #.

В заключение, вам часто не нужно помогать F # type checker. Если существует ошибка типа, сводка по приведенной выше ссылке дает хорошее руководство по исправлению:

Итак, чтобы обобщить то, что вы можете сделать, если компилятор жалуются на недостающие типы или недостаточно информации:

  • Определите вещи до их использования (это включает в себя обеспечение того, чтобы файлы были скомпилированы в правильном порядке)
  • Поместите вещи, которые имеют "известные типы" раньше, чем вещи, которые имеют "неизвестные типы". В частности, вы можете переупорядочивать трубы и аналогичные связанные функции, так что типизированные объекты будут первыми.
  • При необходимости аннотировать. Один общий трюк заключается в том, чтобы добавлять аннотации, пока все не сработает, а затем забрать их один за другим, пока вы не необходимый минимум. Постарайтесь избегать аннотации, если это возможно. Не только это не эстетично, но делает код более хрупким. Гораздо проще изменять типы, если нет явных зависимости от них.