3

たとえば、[Either Int Bool] があり、それを HList に変換したいとします。

[Left 1, Right False, Left 2]

になるだろう

1 .*. False .*. 2 .*. HNil

(実際にはこれは不可能だと思いますが、そうでなければ聞きたいです....そのような関数の型を書くことさえ不可能に思えますが、関数を書くだけでなく、これを行う方法があるかもしれません)。

4

2 に答える 2

1

動的な値であるため HListに変換することはできません[Either Int Bool]が、HList にはその値に依存する静的な型があります。次の点を考慮してください。

  • 1 .*. False .*. 2 .*. HNilタイプありHCons 1 (HCons False (HCons 2 HNil))
  • 1 .*. HNilタイプありHCons 1 HNil

これらの値は両方とも、想定される変換関数の可能な結果ですが、型が異なります。

上記のすべては、HList が持つ値に関する情報をコンパイラがその型を把握するために利用できる必要があるためです。あなたの場合、実行時、つまりプログラムがすでにコンパイルされている場合にのみ、この値を取得できます。

于 2013-09-29T09:42:57.310 に答える
1

HList を使用して拡張可能なバリアントを作成する方法については、Oleg によるこの投稿を参照してください。

于 2013-09-29T10:41:11.103 に答える