У меня есть тест завтра, и одна из тем, которую мы рассматриваем, - это вывод типа. Я просматриваю задание, которое мы сделали, вместе с ответами, которые нам дали за это. Однако, похоже, я не могу следовать. Вопрос, который я не могу подключить ответ для этой функции:Тип вывода вручную
(define foo (lambda (f x y) ((f x) y)))
Теперь, чтобы сделать вывод типов, во-первых, создавать типы:
f : 'f
x : 'x
y : 'y
return = 'r
Тогда вы делаете ограничения. Глядя на первый блок, где вы посылаете x
в f
дает:
'f = 'x -> 'w (w being a new type representing the result of that function).
Чтобы включить у сейчас (z
будучи еще один новый тип с результатом функции w
):
'w = 'y -> 'z
Это будет, следовательно, сделать 'r = 'z
('z
- это то, что будет возвращено). Наконец, где я смущен, это то, где все собрано. Для меня это стало бы:
val foo = fn: 'x -> 'w -> 'z
, который можно переписать в виде:
val foo = fn: 'x -> ('y -> 'z) -> 'z
Однако полученный ответ включает в себя еще два вида ('x
и 'y
):
val foo = fn: 'x -> ('y -> 'z) * 'x * 'y -> 'z
Может кто-то объясняет мне, почему они добавлены, и когда использовать *
?
честно ... все вопросы, я попросил, я думаю, что ваш лучший ответ, который я видел (не то, что другие не были хорошими). Так что спасибо тонне! Я не понимал, что в каждом ответе есть отдельный небольшой раздел ответа. – user2869231