복붙노트

[SCALA] 무형의 냇 유형의 한계

SCALA

무형의 냇 유형의 한계

볼품에, 냇 유형은 유형 수준에서 자연수를 인코딩하는 방법을 나타냅니다. 이것은 고정 된 크기 목록의 예를 들어 사용됩니다. 당신은 유형 수준, 예를 들어,에 계산을 할 수 있습니다 APPEND K 요소 목록에 대한 N 요소 목록과 N + K 요소를 가지고 컴파일 타임에 알려진 목록을 다시 얻을.

이 표현은 예를 들어, 많은 수의 표현 능력 1000000 또는 253, 또는이 원인은 스칼라 컴파일러는 포기하는 것인가?

해결법

  1. ==============================

    1.나는 하나를 자신을 시도합니다. 나는 기꺼이 트래비스 브라운 또는 마일 사빈에서 더 나은 대답을 받아 들일 것입니다.

    나는 하나를 자신을 시도합니다. 나는 기꺼이 트래비스 브라운 또는 마일 사빈에서 더 나은 대답을 받아 들일 것입니다.

    냇은 현재 많은 수를 나타내는 데 사용할 수 없습니다

    냇 중첩 shapeless.Succ [] 유형의 수에 대응 값의 현재 구현에서 :

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

    수 백만을 나타내는 그래서, 당신은 확실히 스칼라 컴파일러를 날려 버릴 것입니다 깊은 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]
                     ^
    

    이는 데 사용할 수 있습니다 예를 들어, [바이트] 어레이의 비트 연산을 수행 할 때 동일한 배열 크기를 적용.

  2. ==============================

    2.무형의 NAT는 교회 인코딩을 사용하여 유형 수준에서 자연 번호를 암호화한다. 또 다른 방법은 비트의 입력 레벨 HList로 원주민을 대표하는 것이다.

    무형의 NAT는 교회 인코딩을 사용하여 유형 수준에서 자연 번호를 암호화한다. 또 다른 방법은 비트의 입력 레벨 HList로 원주민을 대표하는 것이다.

    볼품없는 스타일이 솔루션을 구현 밀도를 확인하십시오.

    나는 한 동안 거기에 근무 한 적이없는, 그것은 무형의 뿌리를 필요로 여기에 '게으른 거기 scalac가 제공하지만, 개념이 고체 인 경우에 :)

  3. from https://stackoverflow.com/questions/21296099/limits-of-nat-type-in-shapeless by cc-by-sa and MIT license