Хрустальный язык карри

Я пытаюсь создать процедуру добавления карри в 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 вместо.

Другие вопросы по тегам