Shapeless ライブラリの目的を簡単に説明してくれる人はいますか?
Scala にはジェネリックと継承機能があるので、Shapeless の用途が少しわかりません。
おそらく、物事を明確にするためのユースケースが役立つでしょう。
ベストアンサー1
shapelessにはさまざまな機能があるため、説明するのは少し難しいです。「変数が何のためにあるのかを、簡単に説明する」方が簡単だと思います。まずは、機能の概要。
大まかに言えば、shapeless は型を使ったプログラミングに関するものです。通常は実行時に行われるようなことをコンパイル時に実行したり、リスト内の各要素の型を正確に追跡したり、タプルから HList やケース クラスに変換したり、(メソッドではなく) 多態的な関数を作成したりします。
典型的な使用シナリオは次のようになります。
- どこかから大量の値を読み込み、
List
- それを型安全にキャストし
List
てHList
HList
例えば値を正規化する多態的関数を使ってそれをマップする- 3番目の要素(静的に であることがわかっている
Int
)を0で埋められた文字列に変換する - HListの値を使用してケースクラスを構築する
参考までに、HList
正確な型、例えばInt :: String :: Boolean :: HNil
(そう、それは本当にはすべてが固定され、サイズが固定されている単一の型です。そのため、コンパイル時に HList に何が格納されるかを正確に把握するか、型安全なキャストが必要になります。
tail
このような HList の を取得するとが得られString :: Boolean :: HNil
、コンパイル時にそのヘッドが になることが保証String
されます。ヘッドの先頭に値を付加すると、同様に、関連するすべての型が保持されます。
Shapelessには、Generic
型クラスでは、タプルやケース クラスでも HList 操作を使用できます。
私がよく使う他の機能は次のとおりです。
Coproducts
String
を使用すると、たとえば「 、Double
またはInt
、それ以外はなし」などの値を静的に型指定できます( とよく似ていますEither
が、2 つの可能性だけに限定されません)。Lenses
これにより、ネストされたケース クラスの操作が簡素化されます。