##ライブラリと実行可能ファイルの違い
どちらも、.hsファイルで、しかもmainを書いてもライブラリはライブラリです。
最初ちょっと困惑したので、まとめておきます。
あまりにも当たり前のことかもしれないので、既知の方は気軽に飛ばしてください。
表題の通り、libraryとexecutableの違いと作り方です。
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に
library
Build-Depends: base < 5, containers, mtl
Exposed-Modules: foo
Ghc-Options: -Wall
このときは、foo.hsの頭にmodule宣言を記述しておく必要があります。
{-もし関数の隠蔽などの関係で使える関数を決め打ちしたい場合は
module foo (zoo) where
のように()でくくれば、それ以外の関数は外から見えない
-}
module foo where
--以下ライブラリの中身
zoo :: Int -> Int
zoo x = x + 2
これはビルドしても実行はできません。mainファイルなどを作って引っ張ってくると利用できます。例えば、以下のような形です。
import foo
main :: IO ()
main = print (foo.zoo x)
#####まとめ
実行可能ファイルとライブラリはcabalの中身で変わる。
executable 実行名 もしくは、
library
ライブラリの場合は.hs本体にモジュール宣言を加える。
module モジュール名 where
こんな感じでしょうか。もしかしたらライブラリの時は頭文字は大文字(つまりFoo)でないとだめとかのルールがあるかもしれません。僕が扱っているものはたいてい大文字なので、動かなかったら大文字に直してみると良いかもしれません。
詳しい方コメントいただけたりするととてもうれしいです。
ライブラリの記名について、コメントより詳しい説明をいただきましたので、加筆、訂正させていただきます。ライブラリとして使いたい場合に関しては、以下のように、ファイル名=モジュール名 かつ モジュール名は大文字始まりとのことです。
{-もし関数の隠蔽などの関係で使える関数を決め打ちしたい場合は
module Foo (zoo) where
のように()でくくれば、それ以外の関数は外から見えない
-}
module Foo where
--以下ライブラリの中身
zoo :: Int -> Int
zoo x = x + 2
そしてどうやら、Qiitaさんは赤字で懸命にそのことを伝えてくれていたようです。
hirataraさんコメントいただきまして本当にありがとうございました。