13

curry-all関数のリストを取り、そのすべてが最初の引数に同じ種類の値を受け入れ、最初の引数がカリー化された関数のリストを生成する単純な関数を、型なし Racket で呼び出すことができます。

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

上記の関数の実行例については、pastrack のこのスニペットを参照してください

これは有効な関数ですが、多態的な型付け構造を考えると 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