#haskell #type-inference
#haskell #вывод типа
Вопрос:
Как работает код Haskell даже без объявления типа?
Комментарии:
1. Вывод типа. (На вопросы, задаваемые без тщательности, ответы записываются без тщательности.)
2. По той же причине, по которой
var
работает в C #.3. Нет. Этот вопрос расплывчатый, плохо написан и не демонстрирует абсолютно никаких усилий, приложенных спрашивающим. 30 минут чтения практически любого введения в Haskell дали бы более подробный ответ, чем те, что были опубликованы здесь до сих пор, достаточный, чтобы либо удовлетворить любопытство, либо задать более значимый вопрос. Лень предназначена для оценки, а не для обучения; пожалуйста, не поощряйте плохие вопросы.
4. @camccann Судя по истории SO OP, она не изучает Haskell. Почему вы должны отклонять вопрос, который совсем не наивен для кого-то, кто знаком с C и друзьями? Как вы думаете, вопрос «что такое указатель?» было бы наивно для кого-то, кто знаком только с FP тоже? И почему оно плохо написано? Вопрос в значительной степени объясняет, что OP хочет знать. Я не вижу смысла в понижающем голосовании. На многие вопросы по SO можно ответить, немного погуглив, так что это тоже не главное. Если вы не знаете модного слова «вывод типа», поиск ответа также непродуктивен.
5. Блин, ребята, успокойтесь. Может быть, мы могли бы помочь оператору написать вопрос получше вместо того, чтобы ругать его, а затем спорить об этом.
Ответ №1:
Примечание: Я предполагаю, что вы имеете в виду подписи типов, потому что, если вы удалите определения типов, такие как type Foo = Bar
или data X = Y
, код больше не будет работать (при условии, что определенный тип, конечно, действительно используется).
Код на Haskell работает без подписей типов, потому что тип переменной / функции просто выводится компилятором, если вы не указываете подпись. Алгоритм, используемый для выполнения этого вывода, является вариантом алгоритма вывода типа Хиндли-Милнера.
Ответ №2:
Потому что очень часто тип может быть выведен из контекста. Например, функция tail
имеет тип [a] -> [a]
, который говорит, что мы переходим из списка в другой список того же типа. Когда вы передаете String
этой функции, известно, что результатом является другая String
, поэтому на самом деле нет необходимости явно указывать это. Таким образом, известно, что тип (tail "hello")
является String (или [Char]
, что на самом деле одно и то же).
Комментарии:
1. -1 хотя вы упоминаете вывод типа, затем вы продолжаете развивать обобщения, о которых на самом деле не было вопроса.
2. @Dan Может быть, мой пример был не совсем хорош, я действительно говорил об обобщениях? В моем понимании вывод типа означает, что вы создаете / связываете функции, и каждая функция преобразует типы, с которыми она работает. Итак, когда есть
( )
applied, независимо от того, что оно применяется, к чему бы вы его ни применяли, это должен быть экземплярNum
. Этот факт сохраняется через структуру, которой является ваша программа. Без явного указания этого ясно, для какого типа данных ваша композиция имеет смысл. Что ж, надеюсь, это общая функция, система типов это не проверяет.3. При повторном взгляде вывод типа
(tail "hello")
является довольно хорошим примером для вопроса. При моем первом чтении я думал, что оно больше сосредоточено на типах универсальных методов. Извините за мою поспешную ошибку.