13

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

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

有关上述函数的运行示例,请参阅 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))

显然,如果所有函数都具有相同的类型(这不是毫无价值的!),则此方法有效,但如果它们具有不同的参数,即使它们的第一个参数的类型是共享的,它也会失败。

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

4

0 回答 0