реализация вывода типа

class FootballTeam : List<FootballPlayer> 
{ 
    public string TeamName; 
    public int RunningTotal;
}

Предыдущий код означает: кучка парней с улицы, играющих в футбол, и у них, похоже, есть имя. Что-то вроде:

People playing football [/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.
}

означает: это футбольная команда, в которой есть руководство, игроки, администраторы и т. д. Что-то вроде:

Image showing members (and other attributes) of the Manchester United team [/g1]

Вот как ваша логика представлена ​​на фотографиях ...

85
задан Daniel A.A. Pelsmaeker 28 May 2015 в 12:41
поделиться

4 ответа

Я нашел следующие ресурсы полезными для понимания вывода типа, в порядке увеличивающейся трудности:

  1. Глава 30 (Вывод типа) книжный PLAI в свободном доступе, Языки программирования: Приложение и Интерпретация , эскизы основанный на объединении вывод типа.
  2. летний курс типы Интерпретации как краткий обзор оценивают подарки изящные средства анализа, введите средства проверки, введите reconstructors и inferencers использование Haskell как метаязык.
  3. Глава 7 (Типы) книжный EOPL, Основы Языков программирования .
  4. Глава 22 (Реконструкция Типа) книжный TAPL, Типы и Языки программирования , и соответствующие реализации OCaml передовод "против" и fullrecon.
  5. Глава 13 (Реконструкция Типа) новый книжный DCPL, Концепции проекта на Языках программирования .
  6. Выбор научных работ .
  7. компилятор Закрытия TypeInference является примером аналитического подхода потока данных к выводу типа, который лучше подходит для динамических языков что подход Hindler Milner.

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

я рекомендую эти два доступных homeworks в ML, который можно оба завершить меньше чем через день:

  1. Интерпретатор PCF ( решение ) для нагреваний.
  2. Вывод типа PCF ( решение ) для реализации алгоритма W для вывода типа Хиндли-Milner.

Эти присвоения от большего количества продвинутого курса:

  1. MiniML

  2. Реализации Полиморфные, Экзистенциальные, Рекурсивные типы (PDF)

  3. Двунаправленный Typechecking (PDF)

  4. Выделение подтипов и Объекты (PDF)

87
ответ дан namin 24 November 2019 в 08:22
поделиться

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

http://www.plai.org/

я попытаюсь суммировать абстрактную идею, сопровождаемую деталями, которые я сразу не нашел очевидным. Во-первых, о выводе типа можно думать генерации и затем решения ограничений. Для генерации ограничений Вы рекурсивно вызываете через синтаксическое дерево и генерируете одно или несколько ограничений на каждый узел. Например, если узел '+', оператор, операнды и результаты должны все быть числами. Узел, который применяет функцию, имеет тот же тип как результат функции и так далее.

Для языка без 'позволенного', можно вслепую решить вышеупомянутые ограничения заменой. Например:

(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

я надеюсь, что это помогает разъяснить несколько темный мир.

27
ответ дан Paul 24 November 2019 в 08:22
поделиться

Типы и языки программирования Benjamin C. Pierce

4
ответ дан Scott Wisniewski 24 November 2019 в 08:22
поделиться

Лямбда Окончательное, стартовое здесь .

3
ответ дан Doug Currie 24 November 2019 в 08:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: