Ale*_*ing 10 scheme types racket parametric-polymorphism typed-racket
我可以在无类型的Racket中编写一个简单的函数,curry-all它接受一个函数列表,所有这些函数都接受第一个参数的相同类型的值,并生成一个函数列表,其第一个参数是curried.
(define (curry-all fs arg)
(map (? (f) (curry f arg)) fs))
Run Code Online (Sandbox Code Playgroud)
有关上述函数的运行示例,请参阅pasterack上的此代码段.
这是一个有效的函数,但我不确定是否甚至可以输入Typed Racket给出其多态类型构造.curry它本身的类型已经相当复杂,显然其类型curry-all必然更复杂.
我做了一个相对简单的尝试来输入这个函数,虽然我很清楚它不会像我喜欢的那样起作用:
(: curry-all
(All [a c b ...]
(Listof (-> a b ... b c)) a
-> (Listof (-> b ... b c))))
(define (curry-all fs arg)
(map (? ([f : (-> a b ... b c)])
(curry f arg))
fs))
Run Code Online (Sandbox Code Playgroud)
显然,如果所有函数都具有相同的类型(这并非毫无价值!),则可以正常工作,但如果它们具有不同的arities,即使它们的第一个参数的类型是共享的,它也会失败.
有没有办法指定这个函数的类型,以便它可以在更一般的情况下工作?