user6083685
user6083685

Reputation:

Crystal lang curried

I try to create curried add proc in Crystal. How make this example to work?

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/#/r/3r0g

I get error

no overload matches 'Proc(Int32, Int32)#call' with types Int32, Int32 Overloads are: - Proc(T, R)#call(*args : *T)

Upvotes: 2

Views: 177

Answers (1)

Stephie
Stephie

Reputation: 3175

From the proc documentation, Proc(Int32, Int32) is a proc that takes one Int32 and returns one Int32. You mean to use Proc(Int32, Int32, Int32). Also, you need to use 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/#/r/3r0m

If you're looking to curry a proc in your application, instead of as a learning exercise, you should use Proc#partial instead.

Upvotes: 6

Related Questions