コードは、非依存型システムではすでに完全にポリモーフィックです。依存型システムに移行することもできます(ただし、複雑さのコストのため、おそらく必要ありません)。この場合、型は次のようになります。
(n : int) -> (a * b * c) -> (match n with 1 -> a | 2 -> b | 3 -> c | _ -> Error)
パッドの提案に加えて、最初にパターンマッチングによって定義する代わりに、レコードまたはオブジェクトタイプを使用して直接「アウトプロジェクション」操作を行うこともできます。
type ('a, 'b, 'c) triple = { nth1 : 'a; nth2 : 'b; nth3 : 'c }
(* replace *) nth_diff_type 2 v (* by *) v.nth2
オブジェクトタイプを使用する場合(事前にタイプを定義する必要がないという構造的なフレーバーが追加されます)
(* replace *) nth_diff_type 2 v (* by *) v#nth2
これらの置換は定数整数でのみ機能することに注意してください(そうでない場合は、整数->型の依存関係が必要になるため)。GADTと実存型を使用して特定の選択を渡すことをサポートすることもできますが、既存の単純型システムに精通していないために、どのように理解するかを理解できないために、莫大な複雑さのコストを支払う必要があります。あなたは本当に物事をやりたいのです。