[解決済み] シェイプレスにおけるNat型の限界値
2022-05-02 12:40:57
質問
Shapelessでは、Nat型は自然数を型レベルで符号化する方法を表しています。これは例えば固定サイズのリストなどに使われる。型レベルで計算を行うことも可能である。
N
のリストに
K
要素を持つことがコンパイル時に分かっているリストを返します。
N+K
要素で構成されています。
この表現は、例えば大きな数字を表現することが可能ですか?
1000000
または2
53
それとも、これではScalaコンパイラがあきらめてしまうのでしょうか?
どのように解決するのですか?
自分でやってみる。トラヴィス・ブラウンやマイルズ・セービンからより良い答えがあれば、喜んで受け入れるよ。
Nat は現在 <強い ない 大きな数を表現するために使われる
現在のNatの実装では、この値はネストしたshapeless.Succ[]型の数に相当する。
scala> Nat(3)
res10: shapeless.Succ[shapeless.Succ[shapeless.Succ[shapeless._0]]] = Succ()
つまり,1000000という数字を表現するためには,1000000レベルの深さにネストされた型を持つことになり,これは間違いなくscalaコンパイラを爆発させるでしょう.実験によると、現在の上限は400程度らしいが、妥当なコンパイル時間のためには、おそらく50以下にとどめるのがベストであろう。
しかし、大きな整数などの値を型レベルで符号化する方法があります。 ただし、計算をしたくない場合に限ります。 . 私の知る限り、それらを使ってできることは、それらが等しいかどうかをチェックすることくらいです。以下を参照してください。
scala> type OneMillion = Witness.`1000000`.T
defined type alias OneMillion
scala> type AlsoOneMillion = Witness.`1000000`.T
defined type alias AlsoOneMillion
scala> type OneMillionAndOne = Witness.`1000001`.T
defined type alias OneMillionAndOne
scala> implicitly[OneMillion =:= AlsoOneMillion]
res0: =:=[OneMillion,AlsoOneMillion] = <function1>
scala> implicitly[OneMillion =:= OneMillionAndOne]
<console>:16: error: Cannot prove that OneMillion =:= OneMillionAndOne.
implicitly[OneMillion =:= OneMillionAndOne]
^
これは、例えば、Array[Byte] に対してビット演算を行う際に、同じ配列サイズを強制するために使用されるかもしれません。
関連
-
[解決済み] Scalaでステートメントの間にN秒待つには?
-
[解決済み] Seq[Future[Person]]ではなく、Future[Seq[Person]]を取得する方法
-
[解決済み] NotUsedとDoneの理解
-
[解決済み] scala 2.11.0 REPL を終了するには?
-
[解決済み] ScalaのバージョンをScala本体から取得するにはどうしたらいいですか?
-
[解決済み] MapのmapValuesとtransformの違いについて
-
[解決済み】Scalaの名前による呼び出しと値による呼び出し、明確化の必要性
-
[解決済み】Scala 2.8における<:<、<%<、=:=の意味と、それらのドキュメントはどこにあるのか?
-
[解決済み] マクロから匿名クラスのメソッドを持つ構造型を取得する
-
[解決済み] HListはタプルの複雑な書き方に過ぎないのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Spark - アプリの投稿時に「設定にマスターURLが設定されている必要があります」というエラーが発生する
-
[解決済み] Scalaでステートメントの間にN秒待つには?
-
[解決済み] AWSのためのScala SDKまたはインターフェースはありますか?
-
[解決済み] Scalaで定数メンバを定義するには?
-
[解決済み] NotUsedとDoneの理解
-
[解決済み] scala.Float to java.Float k/v変換でScala MapをJava Mapに変換するにはどうしたらいいですか?
-
[解決済み] SparkSQL - パーケットファイルを直接読み込む
-
[解決済み】Scala 2.8における<:<、<%<、=:=の意味と、それらのドキュメントはどこにあるのか?
-
[解決済み] Build.scala、%および%%の記号の意味
-
[解決済み] Scalaのパターンマッチングシステムで比較演算子を使う