是一个函数,用于解决Typed Racket中可键入的函数列表的第一个参数?

时间:2015-03-04 08:14:19

标签: types scheme racket parametric-polymorphism typed-racket

我可以在无类型的Racket中编写一个名为curry-all的简单函数,它接受一个函数列表,所有函数都接受第一个参数的相同类型的值,并生成一个函数列表,其第一个参数是curried

(define (curry-all fs arg)
  (map (λ (f) (curry f arg)) fs))

有关上述函数的运行示例,see this snippet on 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))

显然,如果所有函数都具有相同的类型(这并非毫无价值!),则可以正常工作,但如果它们具有不同的元素,即使它们的第一个参数的类型是共享的,它也会失败。

有没有办法指定这个函数的类型,以便它可以在更一般的情况下工作?

0 个答案:

没有答案
相关问题