Хрустальный язык карри
Я пытаюсь создать процедуру добавления карри в Crystal. Как заставить этот пример работать?
semi_curry = ->(f: Proc(Int32, Int32)) { ->(a: Int32) { ->(b: Int32) { f.call(a, b) } } }
add = ->(a: Int32, b: Int32) {a + b}
p semi_curry(add).call(5).call(6)
https://play.crystal-lang.org/
Я получаю ошибку
нет перегрузки соответствует 'Proc(Int32, Int32)#call' с типами Int32, Int32. Перегрузки: - Proc(T, R)#call(*args: *T)
1 ответ
Решение
Из документации по процессу, Proc(Int32, Int32)
это процесс, который занимает один Int32
и возвращает один Int32
, Вы хотите использовать Proc(Int32, Int32, Int32)
, Также вам нужно использовать semi_curry.call(add).call(5).call(6)
,
semi_curry = ->(f: Proc(Int32, Int32, Int32)) { ->(a: Int32) { ->(b: Int32) { f.call(a, b) } } }
add = ->(a: Int32, b: Int32) {a + b}
p semi_curry.call(add).call(5).call(6)
https://play.crystal-lang.org/
Если вы хотите создать прокси в своем приложении, а не в качестве учебного упражнения, вы должны использовать Proc#partial
вместо.