LoginSignup
3
1

More than 5 years have passed since last update.

stackでのライブラリ(library)と実行(executable)ファイルの違い

Last updated at Posted at 2016-12-01

ライブラリと実行可能ファイルの違い

どちらも、.hsファイルで、しかもmainを書いてもライブラリはライブラリです。
最初ちょっと困惑したので、まとめておきます。
あまりにも当たり前のことかもしれないので、既知の方は気軽に飛ばしてください。
表題の通り、libraryとexecutableの違いと作り方です。

foo.cabal
executable foo --ここに実行名を入力
  main-is: foo.hs 
  Build-Depends:    base < 5, containers, mtl, parallel
  Exposed-Modules:  foo--階層がある場合(Data/foo.hs)は.で区切って表記(Data.foo)
  Ghc-Options:      -Wall

これでビルドすると、
$stack exec foo
で実行できます。

ライブラリの場合は

foo.cabal
foo.cabal

library
  Build-Depends:    base < 5, containers, mtl
  Exposed-Modules:  foo
  Ghc-Options:      -Wall

このときは、foo.hsの頭にmodule宣言を記述しておく必要があります。

foo.hs
{-もし関数の隠蔽などの関係で使える関数を決め打ちしたい場合は
module foo (zoo) where
のように()でくくれば、それ以外の関数は外から見えない
-}

module foo where

--以下ライブラリの中身
zoo :: Int -> Int
zoo x = x + 2

これはビルドしても実行はできません。mainファイルなどを作って引っ張ってくると利用できます。例えば、以下のような形です。

main.hs
import foo

main :: IO ()
main = print (foo.zoo x)
まとめ

実行可能ファイルとライブラリはcabalの中身で変わる。
executable 実行名 もしくは、
library
ライブラリの場合は.hs本体にモジュール宣言を加える。
module モジュール名 where

こんな感じでしょうか。もしかしたらライブラリの時は頭文字は大文字(つまりFoo)でないとだめとかのルールがあるかもしれません。僕が扱っているものはたいてい大文字なので、動かなかったら大文字に直してみると良いかもしれません。
詳しい方コメントいただけたりするととてもうれしいです。

ライブラリの記名について、コメントより詳しい説明をいただきましたので、加筆、訂正させていただきます。ライブラリとして使いたい場合に関しては、以下のように、ファイル名=モジュール名 かつ モジュール名は大文字始まりとのことです。

Foo.hs
{-もし関数の隠蔽などの関係で使える関数を決め打ちしたい場合は
module Foo (zoo) where
のように()でくくれば、それ以外の関数は外から見えない
-}

module Foo where

--以下ライブラリの中身
zoo :: Int -> Int
zoo x = x + 2

そしてどうやら、Qiitaさんは赤字で懸命にそのことを伝えてくれていたようです。

hirataraさんコメントいただきまして本当にありがとうございました。

3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1