水晶郎咖喱

2 crystal-lang

我尝试在Crystal中创建curried add proc.如何让这个例子起作用?

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)
Run Code Online (Sandbox Code Playgroud)

https://play.crystal-lang.org/#/r/3r0g

我收到错误

没有重载匹配'Proc(Int32,Int32)#call'与类型Int32,Int32重载是: - Proc(T,R)#call(*args:*T)

RX1*_*X14 5

proc文档中,Proc(Int32, Int32)是一个proc,它接受一个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)
Run Code Online (Sandbox Code Playgroud)

https://play.crystal-lang.org/#/r/3r0m

如果你想在你的应用程序中讨论一个过程,而不是作为一个学习练习,你应该使用Proc#partial.