モジュール名とパッケージ名
Haskellにおいて外部モジュールを使用するにはimport
でモジュール名を宣言する。
import System.Random
Data.Char
のような代表的な幾つかのモジュールは、環境構築時にあらかじめローカル環境に導入されているのでimport
するだけで、すぐ使えるようになる。
しかし、ローカル環境に導入されていないパッケージを使用するにはimport
の前にinstall
が必要になる。
このときinstall
コマンドに指定しなければならないのは、モジュール名ではなくパッケージ名である。
たとえば、乱数を扱うモジュールの名称はSystem.Random
であるが、パッケージの名称はrandom
なので、install
時はrandom
を指定する必要がある。
> :t random
<interactive>:1:1: error: Variable not in scope: random
-- random関数を使いたい。が、そんなものはないと言われる
> :m System.Random
<no location info>: error:
Could not find module ‘System.Random’
It is not a module in the current program, or in any known package.
-- random関数の含まれるSystem.Randomモジュールをimportしようとしたが知らないと言われてしまう
> stack install random
random> configure
random> Configuring random-1.1...
random> build
random> Building random-1.1...
random> Preprocessing library random-1.1...
random> [1 of 1] Compiling System.Random ( System\Random.hs, .stack-work\dist\ca59d0ab\build\System\Random.o )
random>
random> C:\Users\xx\AppData\Local\Temp\stack3120\random-1.1\System\Random.hs:43:1: warning: [-Wtabs]
random> Tab character found here, and in 74 further locations.
random> Please use spaces instead.
random> copy/register
random> Installing library in
random> C:\sr\snapshots\47914953\lib\x86_64-windows-ghc-8.0.2\random-1.1-9tceXaeYIMZ4JrKq20Egog
random> Registering random-1.1...
-- パッケージ名randomを指定してinstall
> :m System.Random
> :t random
random :: (RandomGen g, Random a) => g -> (a, g)
-- random関数が使えるようになった
Haskellを始めてから、しばらくコレが分からなくて苦労した。(何てったって、これが分からないと乱数すら使えない)
モジュールとパッケージの関係は、こんな感じで確認できる。
使いたい関数名等からパッケージ名を調べる
今使いたい乱数を生成する関数random
をHoogleなどでサーチして
モジュールのドキュメントに遷移する。今回はSystem.Random
である。
その上部にある囲みの部分がパッケージ名。
したがってinstall
するときにはcabal install random
なりstack install random
とする。
パッケージ名からモジュール名を調べる
逆にパッケージ名のドキュメントからモジュール名を確認するには、同様にパッケージ名からパッケージのドキュメントに遷移して
Modules
を確認する。