홈>
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 구현에서 표현이 다른가?
실제로 (<<) 연산자를 사용하여 작은 단어를 큰 단어로 "홍보"하고 싶지만 어떻게해야하는지 알 수 없습니다.
UPDATE4와이즈 비츠 인 것 같다
그리고
Word
아키텍처에 의존하고 기계어를 나타냅니다. SML/NJ는 64 비트 아치를 지원하지 않으므로 단어 크기가 다릅니다.
LargeWord
- 답변 # 1
- 답변 # 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
관련 질문
- sml : 배관을 사용해야 하는지 어떻게 알 수 있습니까?
- Sml 모드를 설치했지만 Emacs에서 SML 구문이 인식되지 않습니다
- sml - 두 목록을 인수로 사용하고 첫 번째 목록이 두 번째 목록에 있으면 true를 반환하는 함수를 어떻게 만들 수 있습니까?
- functional programming - SML에서 하위 트리를 가져올 때의 문제
- sml - CMmake를 사용하여 컴파일 할 때 언 바운드 구조 Int
- mutable - SML에서 더 빠른 Fifo 구현
- ml - SML 패키지/라이브러리의 모든 기능을 표시하는 방법이 있습니까? PolyML을 사용하고 있습니다
- sml - 모든 숫자를 포함하는 가장 작은 하위 목록
당신은
Word8.word
유형에 맞습니다Word32.word
그리고Word64.word
공통 유형'a
만 공유 일반적으로Word64.word
로 변환 할 수 없습니다 매개 변수 다형성을 통해.당신이 찾고있는할 수있는(그리고해야 할) 정확한 기능은 다음과 같습니다 :
불행히도, 당신이 발견 한 것처럼,LargeWord.word
Word32
의 별칭입니다Word64
가 아니라 SML/NJ.Basis처럼 보이지 않아LargeWord.word
를 지정합니다. 반드시해야하지만 현실입니다. Poly/ML에서는LargeWord.wordSize
로 보입니다. 126이고 모스크바 ML에는LargeWord
가 없습니다. 구조! 한숨. 그러나 적어도 폴리/ML에서는Word64.word
를 포함 할 수 있습니다 .이 점에 비추어 두 가지 중 하나를 제안하겠습니다.
<올>임시 다형성을 사용할 수 있습니다 : 세 모듈 모두
WORD
서명을 공유하므로 이 서명에는 다음과 같은 것들이 있습니다 :해킹은
LargeInt.int
로 변환하는 것일 수 있습니다. 그런 다음Word64.word
로 :WORD
로 하나의 모듈을 사용하는functor를 만들 수 있습니다Word64
로의 변환을 포함하는 구조를 서명하고 리턴하십시오. .각 사례마다이 기능을 인스턴스화 할 수 있습니다 :
이것은 약간 혼란스럽고
다른 방법으로,이 여분의 functor와 임의 정밀도 정수를 중간 표현으로 사용하지 않으려면 비효율적이고 불필요하기 때문에 표준 라이브러리의LargeWord
를 포함하는 기존 모듈의 계층 구조입니다. 피해야했습니다.LargeWord :> WORD
를 변경할 수 있습니다Word64
를 사용한다고 가정합니다. 대신표준 라이브러리가
LargeWord
를 사용하여 functorial 스타일로 작성된 경우이를 피할 수있었습니다. 재정의 할 수있는 곳에 매개 변수가 고정되어 있어야합니다. 하지만 표준 라이브러리를 더 복잡하게 만듭니다.ML 모듈 시스템 설계와 관련하여
toLargeWord
를 선택할 수 있다고 생각합니다WORD
에서 서명은 많은 functor 인스턴스가 필요하지 않지만 목격 한 것처럼 확장 성이 높지 않기 때문에 매우 편리한 방법입니다. Jane Street의 OCaml 라이브러리 Base 및 Core에 적용된 다양한 철학을 볼 수 있습니다. 와이즈 비즈 (편리한) 그리고 Base에는Char.Map.t
가 있습니다. (확장 가능).여러분의 말이 모두 서명되지 않은 것으로 가정했습니다.