たとえば、[Either Int Bool] があり、それを HList に変換したいとします。
[Left 1, Right False, Left 2]
になるだろう
1 .*. False .*. 2 .*. HNil
(実際にはこれは不可能だと思いますが、そうでなければ聞きたいです....そのような関数の型を書くことさえ不可能に思えますが、関数を書くだけでなく、これを行う方法があるかもしれません)。
たとえば、[Either Int Bool] があり、それを HList に変換したいとします。
[Left 1, Right False, Left 2]
になるだろう
1 .*. False .*. 2 .*. HNil
(実際にはこれは不可能だと思いますが、そうでなければ聞きたいです....そのような関数の型を書くことさえ不可能に思えますが、関数を書くだけでなく、これを行う方法があるかもしれません)。
動的な値であるため HListに変換することはできません[Either Int Bool]
が、HList にはその値に依存する静的な型があります。次の点を考慮してください。
1 .*. False .*. 2 .*. HNil
タイプありHCons 1 (HCons False (HCons 2 HNil))
1 .*. HNil
タイプありHCons 1 HNil
これらの値は両方とも、想定される変換関数の可能な結果ですが、型が異なります。
上記のすべては、HList が持つ値に関する情報をコンパイラがその型を把握するために利用できる必要があるためです。あなたの場合、実行時、つまりプログラムがすでにコンパイルされている場合にのみ、この値を取得できます。
HList を使用して拡張可能なバリアントを作成する方法については、Oleg によるこの投稿を参照してください。