Ответ 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. Если существует ошибка типа, сводка по приведенной выше ссылке дает хорошее руководство по исправлению:
Итак, чтобы обобщить то, что вы можете сделать, если компилятор жалуются на недостающие типы или недостаточно информации:
- Определите вещи до их использования (это включает в себя обеспечение того, чтобы файлы были скомпилированы в правильном порядке)
- Поместите вещи, которые имеют "известные типы" раньше, чем вещи, которые имеют "неизвестные типы". В частности, вы можете переупорядочивать трубы и аналогичные связанные функции, так что типизированные объекты будут первыми.
- При необходимости аннотировать. Один общий трюк заключается в том, чтобы добавлять аннотации, пока все не сработает, а затем забрать их один за другим, пока вы не необходимый минимум. Постарайтесь избегать аннотации, если это возможно. Не только это не эстетично, но делает код более хрупким. Гораздо проще изменять типы, если нет явных зависимости от них.