Вывод типов

Типизация данных

Вывод типов (англ. type inference) — в программировании возможность компилятора самому логически вывести тип значения у выражения. Впервые механизм вывода типов был представлен в языке ML, где компилятор всегда выводит наиболее общий полиморфный тип для всякого выражения. Это не только сокращает размер исходного кода и повышает его лаконичность, но и нередко повышает повторное использование кода[1].

Вывод типов характерен для функциональных языков программирования, хотя со временем он был частично реализован и в объектно-ориентированных языках (C#, D, Visual Basic .NET, Nim, C++11, Vala, Java[a]), где ограничивается возможностью опустить тип идентификатора в определении с инициализацией (см. синтаксический сахар). Например:

var s = "Hello, world!";  // Тип переменной s (от string) выведен исходя из инициализатора

Алгоритмы

Алгоритм Хиндли — Милнера

Алгоритм Хи́ндли — Ми́лнера — механизм вывода типов выражений, реализуемый в языках программирования, основанных на системе типов Хиндли — Милнера, таких как ML (первый язык этого семейства), Standard ML, OCaml, Haskell, F#, Fortress и Boo. Язык Nemerle использует этот алгоритм с рядом необходимых изменений[2].

Механизм вывода типов основан на возможности автоматически полностью или частично выводить тип выражения, полученного при помощи вычисления некоторого выражения. Так как этот процесс систематически производится во время трансляции программы, транслятор часто может вывести тип переменной или функции без явного указания типов этих объектов. Во многих случаях можно опускать явные декларации типов — это можно делать для достаточно простых объектов, либо для языков с простым синтаксисом. Например, в языке Haskell реализован достаточно мощный механизм вывода типов, поэтому указание типов функций в этом языке программирования не требуется. Программист может указать тип функции явно для того, чтобы ограничить её использование только для конкретных типов данных, либо для более структурированного оформления исходного кода.

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

Сама модель типизации основана на алгоритме вывода типов выражений, который имеет своим источником механизм получения типов выражений, используемый в типизированном λ-исчислении, который был предложен в 1958 г. Х. Карри и Р. Фейсом. Далее уже́ Роджер Хиндли в 1969 г. расширил сам алгоритм и доказал, что он выводит наиболее общий тип выражения. В 1978 г. Робин Милнер независимо от Р. Хиндли доказал свойства эквивалентного алгоритма. И, наконец, в 1985 г. Луис Дамас окончательно показал, что алгоритм Милнера является законченным и может использоваться для полиморфных типов. В связи с этим алгоритм Хиндли — Милнера иногда называют также и алгоритмом Дамаса — Милнера.

Система типов определяется в модели Хиндли — Милнера следующим образом:

  1. Примитивные типы являются типами выражений.
  2. Параметрические переменные типов α являются типами выражений.
  3. Если и  — типы выражений, то тип является типом выражений.
  4. Символ является типом выражений.

Выражения, типы которых вычисляются, определяются довольно стандартным образом:

  1. Константы являются выражениями.
  2. Переменные являются выражениями.
  3. Если и  — выражения, то () — выражение.
  4. Если  — переменная, а  — выражение, то  — выражение.

Говорят, что тип является экземпляром типа , когда имеется некое преобразование такое, что:

При этом обычно полагается, что на преобразования типов накладываются ограничения, заключающиеся в том, что:

Сам алгоритм вывода типов состоит из двух шагов — генерация системы уравнений и последующее решение этих уравнений.

Построение системы уравнений

Построение системы уравнений основано на следующих правилах:

  1.  — в том случае, если связывание находится в .
  2.  — в том случае, если , где и .
  3.  — в том случае, если , где это с добавленным связыванием .

В этих правилах под символом понимается набор связываний переменных с их типами:

Решение системы уравнений

Решение построенной системы уравнений основано на алгоритме унификации. Это достаточно простой алгоритм. Имеется некоторая функция , которая принимает на вход уравнение типов и возвращает подстановку, которая делает левую и правую части уравнения одинаковыми («унифицирует» их). Подстановка — это просто проекция переменных типов на сами типы. Такие подстановки могут вычисляться различными способами, которые зависят от конкретной реализации алгоритма Хиндли — Милнера.

См. также

Примечания

Комментарии

  1. поддержка добавлена в Java SE 10

Источники

  1. Andrew W. Appel. A Critique of Standard ML. — Princeton University, revised version of CS-TR-364-92, 1992.
  2. Michał Moskal. Type Inference with Deferral. — 2005. Архивировано 4 марта 2016 года.


Ссылки

Read other articles:

Giorgio II di Gran BretagnaRe Giorgio II di Thomas Hudson, 1744, National Portrait GalleryRe di Gran Bretagna e d'IrlandaStemma In carica11 giugno[1] 1727 –25 ottobre 1760(33 anni e 136 giorni) Incoronazione11 ottobre[2] 1727 PredecessoreGiorgio I SuccessoreGiorgio III Elettore di HannoverIn carica11 giugno 1727 –25 ottobre 1760 PredecessoreGiorgio I SuccessoreGiorgio III Nome completoGiorgio Augusto TrattamentoSua maestà(11.VI.1727 – 25.X.1760...

 

Gereja Santo Yohanes PenginjilGereja Paroki Santo Yohanes PenginjilSt. John the Evangelist Catholic ChurchGereja Santo Yohanes PenginjilLokasiPhiladelphiaNegaraAmerika SerikatDenominasiGereja Katolik RomaArsitekturStatusParokiStatus fungsionalAktifAdministrasiKeuskupanKeuskupan Agung Philadelphia Gereja Katolik Santo Yohanes Penginjil (Inggris: St. John the Evangelist Catholic Churchcode: en is deprecated ) adalah sebuah gereja paroki Katolik yang terletak di Center City, Philadelphia, Amerik...

 

Kejuaraan SupercarsKategoriTouring car racingNegara atau daerah Australia Selandia BaruMusim pertama1997Pembalap24 (52 pembalap termasuk Bathurst 1000)Tim13 (termasuk Bathurst 1000)KonstruktorFord • Chevrolet •Pemasok banDunlopJuara pembalapBrodie KosteckiJuara timErebus MotorsportJuara pabrikanChevroletSitus webwww.supercars.com Musim saat ini Kejuaraan Supercars (Repco Supercars Championship untuk alasan sponsor), atau dahulu dikenal sebagai V8 Supercars, adalah sebuah ajang b...

Alphonse Bertillon Mugshot BertillonLahir(1853-04-24)24 April 1853Paris, PrancisMeninggal13 Februari 1914(1914-02-13) (umur 60)Paris, PrancisPekerjaanPetugas penegak hukum dan peneliti biometrikOrang tuaLouis Bertillon (bapak) Kelas pengajaran teknik Bertillon, Prancis, 1911 Kelas pengajaran teknik Bertillon, Prancis, 1911 Alphonse Bertillon (Prancis: bɛʁtijɔcode: fr is deprecated ; 24 April 1853 – 13 Februari 1914) adalah seorang perwira polisi Prancis dan peneliti b...

 

هذه المقالة يتيمة إذ تصل إليها مقالات أخرى قليلة جدًا. فضلًا، ساعد بإضافة وصلة إليها في مقالات متعلقة بها. (يناير 2020) الكلية التقنية بالطائف معلومات التأسيس 2004  الموقع الجغرافي إحداثيات 21°21′35″N 40°30′34″E / 21.35973°N 40.509559°E / 21.35973; 40.509559  المكان الطائف  البلد �...

 

Bank MUFGJenisPublikIndustriJasa keuanganCabang754 (Jepang) 79 (di luar Jepang)TokohkunciKanetsugu Mike (Presiden & CEO)Laba bersihJPY 1.232 miliar (FY 2017)PemilikMitsubishi UFJ Financial Group, Inc. (MUFG)Karyawan34.000IndukMitsubishi UFJ Financial Group, Inc. (MUFG)Situs webwww.bk.mufg.jp  MUFG Bank, Ltd. (株式会社三菱UFJ銀行code: ja is deprecated , Kabushiki kaisha mitsubishi yūefujei ginkō) merupakan bank terbesar di Jepang menurut asetnya,[1] yang didirikan pa...

Shashank VyasVyas pada acara pesta Colors TV tahun 2015Lahir30 November 1986 (umur 37)Ujjain, Madhya Pradesh, India[1]Tempat tinggalMumbai, Maharashtra, IndiaKebangsaanIndiaPekerjaanAktor dan ModelTahun aktif2010–sekarangDikenal atasAnandhi sebagai Jagdish Bhairon Singh[2]Tinggi185 cm (6 ft 1 in)Orang tuaVikas. K. Vyas dan Geeta Vyas Shashank Vyas (lahir 30 November 1986) adalah seorang aktor, film televisi & model. Dia terkenal karena peran Jag...

 

41e législature du Canada 2 juin 2011 - 2 août 2015 1re session : 2 juin 2011-13 septembre 20132de session : 16 octobre 2013-2 août 2015 Gouvernement Type Conservateur majoritaire Premier ministre Stephen Harper 6 février 2006-4 novembre 2015 Conseil des ministres 28e Chambre des communes Composition Conservateurs (159) Néo-démocrates (95) Libéraux (36) Bloquistes (2) Verts (2) Forces et Démocratie (2)Indépendants (6)Vacants (5) Président Andrew Scheer (Conservateur)...

 

Voce principale: Ternana Calcio. Unione Sportiva TerniStagione 1925-1926Sport calcio Squadra Terni Presidente Gherado Gazzoli Seconda Divisione1º posto nel girone G, 3º posto nel girone finale B. Miglior marcatoreCampionato: Pelligot, Cabiati (1) StadioViale Brin 1926-1927 Si invita a seguire il modello di voce Questa voce raccoglie le informazioni riguardanti l'Unione Sportiva Terni nelle competizioni ufficiali della stagione 1925-1926. Rosa N. Ruolo Calciatore A Pelligot Ampelio Cab...

Regional anthem of Guernsey Sarnia CherieEnglish: Dear GuernseyRegional anthem of the Bailiwick of GuernseyLyricsGeorge Deighton, 1911MusicDomenico Santangelo, 1911 Sarnia Cherie (English: Dear Guernsey) is used as the unofficial anthem of Guernsey, one of the Channel Islands. Sarnia is a traditional Latin name for the island.[1] George Deighton wrote Sarnia Cherie in 1911, with Domenico Santangelo composing the tune later the same year. The anthem can be heard on a number of occ...

 

Football competition The UEFA Champions League (also known as the European Cup) is an annual club soccer competition organized by the Union of European Football Associations (UEFA) and contested by top-division European clubs, deciding the competition winners. The competition attracts an extensive television audience, not just in Europe, but throughout the world. The final of the tournament has been, in recent years, the most-watched annual sporting event in the world.[1] The final of...

 

Longest Beethoven piano sonata, composed in 1818 Beethoven in 1818–19; portrait by Ferdinand Schimon [de] (1797–1852); source: the Library of Congress Ludwig van Beethoven's Piano Sonata No. 29 in B♭ major, Op. 106 (known as the Große Sonate für das Hammerklavier, or more simply as the Hammerklavier) is a piano sonata that is widely viewed as one of the most important works of the composer's third period and among the greatest piano sonatas of all time. Completed in ...

La modifica 135221916 della pagina Template:Calcio femminile in Italia 2017-2018, datata 31 agosto 2023, proviene dalla pagina Template:Calcio in Italia 2017-2018 a seguito di uno scorporo. Per risalire agli autori originari consulta la cronologia della pagina. Se la voce di origine fosse stata cancellata, per favore richiedi a un amministratore di riportarne manualmente la cronologia qui sotto, se non fosse già stato fatto.

 

この項目には、一部のコンピュータや閲覧ソフトで表示できない文字が含まれています(詳細)。 数字の大字(だいじ)は、漢数字の一種。通常用いる単純な字形の漢数字(小字)の代わりに同じ音の別の漢字を用いるものである。 概要 壱万円日本銀行券(「壱」が大字) 弐千円日本銀行券(「弐」が大字) 漢数字には「一」「二」「三」と続く小字と、「壱」「�...

 

NSG-2 classified railway station in Kerala, India For the other major railway station in Ernakulam, see Ernakulam Town railway station. Ernakulam JunctionErnakulam South Indian Railways stationMain entrance of Ernakulam Junction before the reconstruction in 2022General informationLocationKochi, KeralaCoordinates9°58′08″N 76°17′30″E / 9.96885°N 76.29160°E / 9.96885; 76.29160Owned byIndian RailwaysOperated bySouthern Railway zoneLine(s)Ernakulam–Kottayam–...

2016年美國總統選舉 ← 2012 2016年11月8日 2020 → 538個選舉人團席位獲勝需270票民意調查投票率55.7%[1][2] ▲ 0.8 %   获提名人 唐納·川普 希拉莉·克林頓 政党 共和黨 民主党 家鄉州 紐約州 紐約州 竞选搭档 迈克·彭斯 蒂姆·凱恩 选举人票 304[3][4][註 1] 227[5] 胜出州/省 30 + 緬-2 20 + DC 民選得票 62,984,828[6] 65,853,514[6]...

 

 烏克蘭總理Прем'єр-міністр України烏克蘭國徽現任杰尼斯·什米加尔自2020年3月4日任命者烏克蘭總統任期總統任命首任維托爾德·福金设立1991年11月后继职位無网站www.kmu.gov.ua/control/en/(英文) 乌克兰 乌克兰政府与政治系列条目 宪法 政府 总统 弗拉基米尔·泽连斯基 總統辦公室 国家安全与国防事务委员会 总统代表(英语:Representatives of the President of Ukraine) 总...

 

أبجدية سيريلية صربية أبجدية سيريلية صربية نمط الأبجدية لغات الصربية حقبة القرن التاسع - الحاضر أصول هيروغليفية مصرية[1]الأبجدية الفينيقيةألفبائية يونانية (partly أبجدية غلاغوليتسية)أبجدية سيريلية مبكرةأبجدية سيريلية صربية يونيكود subset of Cyrillic (U+0400...U+04FF) إسو 15924 Cyrl ٭ قد تح�...

هذه المقالة تحتاج للمزيد من الوصلات للمقالات الأخرى للمساعدة في ترابط مقالات الموسوعة. فضلًا ساعد في تحسين هذه المقالة بإضافة وصلات إلى المقالات المتعلقة بها الموجودة في النص الحالي. (أكتوبر 2018) الأكاديمية الوطنية للعلوم في أوكرانيا   معلومات التأسيس 1918  الموقع الجغر...

 

Dutch politician and civil engineer Paulus Jansen Paulus Fredericus Cornelius Jansen (born 2 March 1954) is a Dutch civil engineer and Socialist Party politician who served as a member of the House of Representatives from 30 November 2006 until 14 May 2014. Jansen was born in Roermond and studied architectural engineering at Eindhoven University of Technology. From 1995 to 2003 he was a member as well as SP group leader in the provincial council of the province of Utrecht. From 2001 to 2006 h...