Каррирование в типизированной ракетке

В обычном Racket ((curry * 2) 3) работает должным образом, в результате чего 6.

Однако в Typed Racket:

> ((curry * 2) 3)
; readline-input:3:0: Type Checker: could not apply function;
;  wrong number of arguments provided
;   expected: 0
;   given: 1
;   in: ((curry * 2) 3)
; [,bt for context]

Почему?


person Ealhad    schedule 29.03.2017    source источник
comment
(удалено, потому что это был скорее ответ, поэтому я скопировал текст в ответ)   -  person querist    schedule 29.03.2017


Ответы (1)


Я считаю, что это как-то связано с тем, что * может принимать только один аргумент, поэтому, когда вы каррируете его с параметром, он возвращает процедуру, которая не принимает дополнительных аргументов. Введите (curry * 2) в командной строке в typed / racket и посмотрите на результат: (-> Number).

Обратите внимание, что есть только возвращаемый тип и нет параметра. Я не вижу способа обойти это в печатной ракетке, но надеюсь, что это, по крайней мере, объясняет, почему это происходит. Вы должны быть в безопасности при использовании каррирования с более сложными процедурами, если у них нет возможности принимать только один параметр.

person querist    schedule 29.03.2017
comment
Действительно, когда я (define mult *) с (: mult : (-> Number Number Number)) Он работает нормально. Хотя это странно; каррирование невозможно для процедур с множеством арностей в Typed Racket? - person Ealhad; 30.03.2017
comment
Я недостаточно знаю о Typed Racket, чтобы ответить на ваш комментарий, но я могу предоставить сокращенное обозначение вашего обходного пути: ((curry (ann * (-> Number Number Number)) 2) 3). См. ann. - person Gibstick; 31.03.2017