ฉันจะลองด้วยตัวเอง ฉันยินดีที่จะยอมรับคำตอบที่ดีกว่าจาก Travis Brown หรือ Miles Sabin
ปัจจุบันไม่สามารถใช้Nat แทนจำนวนมากได้
ในการใช้งาน Nat ในปัจจุบันค่าจะสอดคล้องกับจำนวนของ shapeless ที่ซ้อนกันประเภท [cc]:
scala> Nat(3)
res10: shapeless.Succ[shapeless.Succ[shapeless.Succ[shapeless._0]]] = Succ()
ดังนั้นเพื่อเป็นตัวแทนของจำนวน 1000000 คุณจะต้องมีประเภทที่ซ้อนกัน 1000000 ระดับลึกซึ่งแน่นอนจะรวบรวมคอมไพเลอร์สกาล่า ขีด จำกัด ปัจจุบันดูเหมือนจะอยู่ที่ประมาณ 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]