6

1)あるIntタイプからタイプにどのように変換しますNumか?

同様の質問が以前に行われ、その答えは(Haskell wikiにあるように)を使用することfromIntegralです。fromIntegralタイプを返すNumので、これを希望の形式にキャストする必要があります。

私はWord16それをに変換する必要があるInt64ので、私は次のことをしています

let valueLength = (fromIntegral(tagLength) :: Int64)

tagLengthタイプはどこにありますかWord16

このアプローチは正しいですか?

2)型変換を安全に処理するにはどうすればよいですか?

Short私が信じている整数用のJavaのバックグラウンドから来ておりInt、としてLong 使用することはできますが、その逆はできません。Haskellでは私が書いたらshortint

256 :: Word8

その中ghciで0を返します。

4

1 に答える 1

21

Word16を取得してInt64に変換する必要があるため、次のようにします。

let valueLength = (fromIntegral(tagLength) :: Int64)

このアプローチは正しいですか?

GHCに聞いてみよう!

Prelude Data.Word Data.Int> :t fromIntegral :: Word16 -> Int64
fromIntegral :: Word16 -> Int64 :: Word16 -> Int64

いいね。

型変換を安全に処理するにはどうすればよいですか?

Haskellには型変換はありません。まったく。すべての「変換」は、あるタイプから別のタイプに「変換」する関数を作成することによって実行する必要があります。

私が書く256 :: Word8ghciそれは戻ります0

数値リテラルは多形です。小数点のないものについては、fromInteger暗黙的に使用されます。

Prelude> :t 256
256 :: Num a => a
Prelude> :t fromInteger
fromInteger :: Num a => Integer -> a
Prelude> fromInteger (256 :: Integer) :: Word8
0

単形型の数値リテラルがその型の範囲外であるという警告などがあったとしたら、それは良いことかもしれません。おそらく、GHCのバグトラッカーに機能リクエストを提出する必要があります。

于 2013-03-17T14:13:29.133 に答える