人気ブログランキング | 話題のタグを見る

System.Random(11) インポートリスト

System.Random 解読シリーズ

モジュールのエクスポートリストの後は、外部モジュールのインポートリストが続く。System.Random のソースファイルの場合は次のようになっている。インポートされたモジュールは System.Random の内部処理で使われるので、Haddock には表示されない。

import Prelude

import Data.Int

#ifdef __NHC__
import CPUTime( getCPUTime )
import Foreign.Ptr ( Ptr, nullPtr )
import Foreign.C( CTime, CUInt )
#else
import System.CPUTime( getCPUTime )
import System.Time( getClockTime, ClockTime(..) )
#endif
import Data.Char( isSpace, chr, ord )
import System.IO.Unsafe ( unsafePerformIO )
import Data.IORef
import Numeric( readDec )

#ifdef や #else はコンパイラのプリプロセッサへの指示を行うプラグマである。意味は gcc の場合と同じようだ。__NHC__ フラグ立っている場合はコンパイラが nhc98 の場合だ。nhc98 コンパイラは Unix プラットフォームのコンパイラで、メモリ使用量の少ない小さいオブジェクトコードを生成する。

Prelude モジュールは Haskell の標準的なモジュールで全てのモジュールにデフォールトでインポートされる。上の例のように明示的にインポートしてもいいし、明示的なインポートがなくても暗黙のうちにインポートされる。

Data.Int モジュールは整数型を定めている。Data.Int 型で data 宣言されている整数型は Int, Int8, Int32, Int64 でいずれも符号付きの2進数の整数だ。これらのデータ型は、Bounded, Enum, Eq, Integral, ... などの数多くの型クラスのインスタンスになっている。

System.CPUTime モジュールでは getCPUTime 関数のみをインポートしている。getCPUTime 関数は picosecond 単位で CPU タイムを取得する。

System.Time モジュールからは getClockTime 関数と ClockTime 型をインポートする。ClockTime(..) の (..) は ClockTime 型のフィールドもインポートすることを示している。getClockTime 関数は現在のシステムの時刻を取得し IO ClockTime 型で返す。ClockTime 型のコンストラクタは Tod で Tod Integer Integer のように Integer 型のフィールドを2つ持っている。

Data.Char モジュールからは isSpace 関数と chr 関数、ord 関数をインポートする。isSpace はキャラクターが空白文字であるかを判断し、chr 関数は整数をASCIIコードに変換し、ord 関数はASCIIコードを整数に変換する。

System.IO.Unsafe モジュールからは unsafePerformIO 関数をインポートする。unsafePerformIO 関数の型は unsafePerformIO :: IO a -> a で IO モナドにバックドアをつける働きがあるらしいが詳しくは調べなかった。

Data.IORef モジュールはIOモナドの中に代入可能な変数を導入するモジュールだ。

Numeric モジュールからは readDec 関数がインポートされる。readDec 関数は文字列を10進数として読み取って整数型の値を得る。

乱数発生というような単純明快な動作のモジュールも unsafePerformIO などがインポートされていると怪しさを感じてしまう。
by tnomura9 | 2015-02-16 18:13 | Haskell | Comments(0)
<< TED.com System.Random (... >>