>

8,16,32 비트 워드를 64 비트 워드로 변환하는 다형성 함수를 만들고 싶습니다. 어떻게해야합니까?

업데이트 1 기본 라이브러리에서 모든 단어 구조에는 toLarge 함수가 있습니다.  그리고 fromLarge   LargeWord 와의 변환 , 이는 Word32의 동의어를 이해하는 한입니다.

UPDATE2

사양에 따르면 단어 크기는 2의 거듭 제곱이어야하지만 SML/NJ에서는

Standard ML of New Jersey v110.84 [built: Mon Dec 03 10:23:14 2018]
- Word.wordSize;
val it = 31 : int
- Word32.wordSize;
val it = 32 : int
- Word.toLarge;
val it = fn : word -> Word32.word
> LargeWord.wordSize;
val it = 32 : int

PolyML에있는 동안

Poly/ML 5.7.1 Release
> Word.wordSize;
val it = 63: int
> Word64.wordSize;
val it = 64: int
> Word.toLarge;
val it = fn: word -> ?.word
> LargeWord.wordSize;
val it = 64: int

어떻게? 왜 Word.wordSize  2의 힘이 아닌가? 그리고 왜 Word  이러한 SML 구현에서 표현이 다른가?

UPDATE3

실제로 (<<) 연산자를 사용하여 작은 단어를 큰 단어로 "홍보"하고 싶지만 어떻게해야하는지 알 수 없습니다.

UPDATE4

와이즈 비츠 인 것 같다  그리고 Word  아키텍처에 의존하고 기계어를 나타냅니다. SML/NJ는 64 비트 아치를 지원하지 않으므로 단어 크기가 다릅니다.

LargeWord

  • 답변 # 1

    당신은 Word8.word 유형에 맞습니다 Word32.word  그리고 Word64.word  공통 유형 'a 만 공유  일반적으로 Word64.word 로 변환 할 수 없습니다  매개 변수 다형성을 통해.

    당신이 찾고있는할 수있는(그리고해야 할) 정확한 기능은 다음과 같습니다 :

    Word<N>.toLargeWord : word -> LargeWord.word
    
    
    불행히도, 당신이 발견 한 것처럼, LargeWord.word   Word32 의 별칭입니다   Word64 가 아니라  SML/NJ.Basis처럼 보이지 않아 LargeWord.word 를 지정합니다.  반드시해야하지만 현실입니다. Poly/ML에서는 LargeWord.wordSize 로 보입니다.  126이고 모스크바 ML에는 LargeWord 가 없습니다.  구조! 한숨. 그러나 적어도 폴리/ML에서는 Word64.word 를 포함 할 수 있습니다 .

    이 점에 비추어 두 가지 중 하나를 제안하겠습니다.

    <올>

    임시 다형성을 사용할 수 있습니다 : 세 모듈 모두 WORD 서명을 공유하므로  이 서명에는 다음과 같은 것들이 있습니다 :

    val toLargeInt : word -> LargeInt.int
    
    

    해킹은 LargeInt.int 로 변환하는 것일 수 있습니다.  그런 다음 Word64.word 로 : WORD 로 하나의 모듈을 사용하는functor를 만들 수 있습니다   Word64 로의 변환을 포함하는 구조를 서명하고 리턴하십시오. .

    functor ToWord64 (WordN : WORD) = struct
        fun toWord64 (n : WordN.word) : Word64.word =
            Word64.fromLargeInt (WordN.toLargeInt n)
    end
    
    

    각 사례마다이 기능을 인스턴스화 할 수 있습니다 :

    structure Word8ToWord64 = ToWord64(Word8)
    val myWord64 = Word8ToWord64.toWord64 myWord8
    
    

    이것은 약간 혼란스럽고 LargeWord 를 포함하는 기존 모듈의 계층 구조입니다.  피해야했습니다.

    다른 방법으로,이 여분의 functor와 임의 정밀도 정수를 중간 표현으로 사용하지 않으려면 비효율적이고 불필요하기 때문에 표준 라이브러리의 LargeWord :> WORD 를 변경할 수 있습니다   Word64 를 사용한다고 가정합니다.  대신

    표준 라이브러리가 LargeWord 를 사용하여 functorial 스타일로 작성된 경우이를 피할 수있었습니다.  재정의 할 수있는 곳에 매개 변수가 고정되어 있어야합니다. 하지만 표준 라이브러리를 더 복잡하게 만듭니다.

    ML 모듈 시스템 설계와 관련하여 toLargeWord 를 선택할 수 있다고 생각합니다   WORD 에서  서명은 많은 functor 인스턴스가 필요하지 않지만 목격 한 것처럼 확장 성이 높지 않기 때문에 매우 편리한 방법입니다. Jane Street의 OCaml 라이브러리 Base 및 Core에 적용된 다양한 철학을 볼 수 있습니다. 와이즈 비즈  (편리한) 그리고 Base에는 Char.Map.t 가 있습니다.  (확장 가능).

    여러분의 말이 모두 서명되지 않은 것으로 가정했습니다.

  • 답변 # 2

    다형성으로 만들 수있는 방법이 없다고 결론지었습니다. 대신 적절한 Map.M(Char).t 를 사용해야합니다  이와 같은 방법 :

    toLarge/fromLarge
    
    

    fun toWord64 (w : Word8.word) : Word64.word = Word64.fromLarge (Word8.toLarge w) 를 사용할 수 있습니다  직접, 그러나 결과 값이 toLarge 가되도록하고 싶습니다. . SML/NJ로 컴파일되지만이 함수를 호출하면 런타임 예외가 발생합니다.

    그런데 32 비트 SML/NJ의 바이트 배열에서 Word64를 추출하는 방법을 찾지 못했습니다.

    Word64

  • 이전 python - pandas 0234에서 두 열을 조합하여 그룹화
  • 다음 reactjs - React의 setState는 선택적으로 상태를 업데이트합니다