class FootballTeam : List<FootballPlayer>
{
public string TeamName;
public int RunningTotal;
}
Предыдущий код означает: кучка парней с улицы, играющих в футбол, и у них, похоже, есть имя. Что-то вроде:
[/g0]
В любом случае, этот код (из моего ответа)
public class FootballTeam
{
// Football team rosters are generally 53 total players.
private readonly List<T> _roster = new List<T>(53);
public IList<T> Roster
{
get { return _roster; }
}
public int PlayerCount
{
get { return _roster.Count(); }
}
// Any additional members you want to expose/wrap.
}
означает: это футбольная команда, в которой есть руководство, игроки, администраторы и т. д. Что-то вроде:
[/g1]
Вот как ваша логика представлена на фотографиях ...
Я нашел следующие ресурсы полезными для понимания вывода типа, в порядке увеличивающейся трудности:
Однако, так как лучший способ учиться состоит в том, чтобы сделать, я настоятельно рекомендую реализовать вывод типа для игрушечного функционального языка путем работы через присвоение домашней работы курса языков программирования.
я рекомендую эти два доступных homeworks в ML, который можно оба завершить меньше чем через день:
Эти присвоения от большего количества продвинутого курса:
Неудачно, что так большая часть литературы по предмету является очень плотной. Я также был на Вашем месте. Я получил свое первое введение в предмет с Языков программирования: Приложения и Интерпретация
я попытаюсь суммировать абстрактную идею, сопровождаемую деталями, которые я сразу не нашел очевидным. Во-первых, о выводе типа можно думать генерации и затем решения ограничений. Для генерации ограничений Вы рекурсивно вызываете через синтаксическое дерево и генерируете одно или несколько ограничений на каждый узел. Например, если узел '+', оператор, операнды и результаты должны все быть числами. Узел, который применяет функцию, имеет тот же тип как результат функции и так далее.
Для языка без 'позволенного', можно вслепую решить вышеупомянутые ограничения заменой. Например:
(if (= 1 2)
1
2)
здесь, мы можем сказать, что условие, если оператор должен быть булевской переменной, и что тип, если оператор совпадает с типом его "тогда" и "еще" пункты. Так как мы знаем 1, и 2 числа, заменой, мы знаем, "если" оператор является числом.
то, Где вещи становятся противными, и что я не мог понять некоторое время, имеет дело с позволенным:
(let ((id (lambda (x) x)))
(id id))
Здесь, мы связали 'идентификатор' с функцией, которая возвращает то, что Вы передали в, иначе знали как тождественное отображение. Проблемой является тип параметра функции 'x', отличается на каждом использовании идентификатора. Второй 'идентификатор' является функцией от a-> a, где банка быть чем-либо. Первое от (a-> a)-> (a-> a), Это известно как позволенный полиморфизм. Ключ должен решить ограничения в особом порядке: сначала решите ограничения для определения 'идентификатора'. Это будет a-> a. Тогда новыми, отдельными копиями типа идентификатора можно заменить в ограничения каждое место 'идентификатор', используется, например, a2-> a2 и a3-> a3.
, Который не был с готовностью объяснен в ресурсах онлайн. Они упомянут алгоритм W или M, но не, как они работают с точки зрения решения ограничений, или почему это не блюет на позволенном полиморфизме: каждый из тех алгоритмов осуществляет упорядочивание при решении ограничений.
я нашел этот ресурс чрезвычайно полезным для связи Алгоритма W, M, и общего понятия ограничительного поколения и решающий все вместе. Это немного плотно, но лучше, чем многие:
http://www.cs.uu.nl/research/techreps/repo/CS-2002/2002-031.pdf
Многие из других бумаг там хороши также:
http://people.cs.uu.nl/bastiaan/papers.html
я надеюсь, что это помогает разъяснить несколько темный мир.
Типы и языки программирования Benjamin C. Pierce