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