Giới hạn của loại Nat trong Shapless


151

Trong hình dạng, kiểu Nat đại diện cho cách mã hóa số tự nhiên ở cấp độ loại. Điều này được sử dụng ví dụ cho danh sách kích thước cố định. Bạn thậm chí có thể thực hiện các phép tính ở cấp độ loại, ví dụ nối thêm danh sách các Nphần tử vào danh sách các Kphần tử và lấy lại danh sách đã biết tại thời điểm biên dịch để có N+Kcác phần tử.

Là đại diện này có khả năng đại diện cho số lượng lớn, ví dụ 1000000hoặc 2 53 , hoặc điều này sẽ khiến trình biên dịch Scala từ bỏ?


21
Bài thuyết trình NE Scala của Miles năm ngoái đã giải quyết câu hỏi này và câu trả lời ngắn gọn là có thể đại diện cho số lượng lớn ở cấp độ loại trong Scala, hoặc ít nhất là trong 2.10 bằng cách sử dụng các loại singleton , nhưng nó có thể không đáng . Shapless 2.0 hiện vẫn sử dụng mã hóa Church, sẽ đưa bạn tới 1.000 hoặc hơn trước khi trình biên dịch bỏ cuộc.
Travis Brown

3
Tôi sẽ cố gắng viết ra một câu trả lời với một chút bối cảnh sau ngày hôm nay. Là một lưu ý phụ, không quá khó để làm việc với các loại số nguyên nếu bạn cần số cấp loại lớn hơn, ví dụ như xem bài đăng trên blog của tôi ở đây hoặc chức năng của singleton trong Shapless .
Travis Brown

2
Nếu bạn muốn thực hiện số học trên các số cấp độ lớn, bạn có thể xem xét triển khai chúng như một danh sách các bit được liên kết.
Karol S

1
@KarolS Tôi có một triển khai chiến lược đó! Và tôi rất vui khi được đóng góp nó cho bất cứ ai quan tâm, mặc dù điều đó là vô ích trừ khi ai đó có thể giúp giải quyết stackoverflow.com/questions/31768203/
Lỗi

2
Có vẻ như stackoverflow.com/questions/31768203/ đã được giải quyết, vì vậy bạn có thể đóng góp mã cho mình và đóng câu hỏi bằng câu trả lời của riêng bạn không?
Andriy Kuba

Câu trả lời:


17

Tôi sẽ cố gắng một mình. Tôi sẵn sàng chấp nhận một câu trả lời tốt hơn từ Travis Brown hoặc Miles Sabin.

Nat hiện không thể được sử dụng để đại diện cho số lượng lớn

Trong triển khai hiện tại của Nat, giá trị tương ứng với số loại hình dạng lồng nhau.Succ []:

scala> Nat(3)
res10: shapeless.Succ[shapeless.Succ[shapeless.Succ[shapeless._0]]] = Succ()

Vì vậy, để đại diện cho số 1000000, bạn sẽ có một loại được lồng sâu 1000000 cấp, điều này chắc chắn sẽ làm nổ tung trình biên dịch scala. Giới hạn hiện tại dường như là khoảng 400 từ thử nghiệm, nhưng trong thời gian biên dịch hợp lý, có lẽ tốt nhất là ở dưới 50.

Tuy nhiên, có một cách để mã hóa các số nguyên lớn hoặc các giá trị khác ở cấp độ loại, với điều kiện bạn không muốn thực hiện các phép tính trên chúng . Điều duy nhất bạn có thể làm với những người theo như tôi biết là kiểm tra xem chúng có bằng nhau hay không. Xem bên dưới.

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]
                 ^

Điều này có thể được sử dụng để thực thi kích thước mảng tương tự khi thực hiện các thao tác bit trên Mảng [Byte].


Chỉ cần thấy câu trả lời này và +1, đây là một ví dụ tốt. Mặc dù đáng chú ý là bạn có thể cung cấp các lớp loại như ví dụ như Shapless ops.nat.Sumsẽ chứng kiến ​​rằng hai số nguyên cấp loại có một số tiền cụ thể, v.v. (chúng chỉ cần được cung cấp bởi một macro).
Travis Brown

1
Dưới đây là một ví dụ về một Concatlớp loại cho phép nối hai chuỗi mức loại thông qua một macro. Một lớp loại để tính tổng các số nguyên cấp loại có thể trông rất giống nhau.
Frank S. Thomas

5

Shapless's Natmã hóa các số tự nhiên ở cấp độ loại bằng mã hóa Church. Một phương pháp thay thế là biểu diễn các naturals dưới dạng một loại HList cấp độ bit.

Kiểm tra dày đặc mà thực hiện giải pháp này trong một phong cách hình dạng.

Tôi đã không làm việc với nó trong một thời gian, và nó cần một sự rắc Lazyrối ' ở đây và ở đó khi scalac từ bỏ, nhưng khái niệm này là vững chắc :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.