Help us understand the problem. What is going on with this article?

Haskellで外部モジュールを使いたいとき(モジュールimportとパッケージinstall)

モジュール名とパッケージ名

Haskellにおいて外部モジュールを使用するにはimportでモジュール名を宣言する。

import.hs
import System.Random

Data.Charのような代表的な幾つかのモジュールは、環境構築時にあらかじめローカル環境に導入されているのでimportするだけで、すぐ使えるようになる。
しかし、ローカル環境に導入されていないパッケージを使用するにはimportの前にinstallが必要になる。

このときinstallコマンドに指定しなければならないのは、モジュール名ではなくパッケージ名である。

たとえば、乱数を扱うモジュールの名称はSystem.Randomであるが、パッケージの名称はrandomなので、install時はrandomを指定する必要がある。

install.hs
> :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などでサーチして
image.png

モジュールのドキュメントに遷移する。今回はSystem.Randomである。
image.png

その上部にある囲みの部分がパッケージ名。
したがってinstallするときにはcabal install randomなりstack install randomとする。

パッケージ名からモジュール名を調べる

逆にパッケージ名のドキュメントからモジュール名を確認するには、同様にパッケージ名からパッケージのドキュメントに遷移してimage.png

Modulesを確認する。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした