36344


Haskell でちょっとしたツールを記述する際に、いちいちプロジェクト (というかビルド設定など)
を作成し、スクリプトに修正を加えるたびにビルドをいちいち回しなおすのは、手間です。

実行可能スクリプトとして、 Haskell を記述することはできないでしょうか？


CC BY-SA 3.0
2017-01-13T13:22:45.897
31825
2018-10-17T05:10:27.877
754
question
haskell
Haskell で実行可能スクリプトを記述するには？


Stack を利用すると可能でした。  
詳細: <https://docs.haskellstack.org/en/stable/GUIDE/#script-interpreter>

以下、実行可能 hello-world.hs の抜粋です。

[code]

    #!/usr/bin/env stack
    -- stack --resolver lts-3.2 --install-ghc runghc --package turtle
    
    {-# LANGUAGE OverloadedStrings #-}
    
    import Turtle
    main = echo "Hello World!"
    
[/code]


CC BY-SA 3.0
2017-01-13T13:22:45.897
31826
2017-01-13T13:22:45.897
754
31825
answer


[Stack](https://docs.haskellstack.org) を使っているなら、`stack exec`
と組み合わせることで連携できます。この方法は GHC のバージョンの指定や外部パッケージの追加など、よりきめ細かい設定をすることができます。

[code]

    $ stack exec -- runghc HelloWorld.hs 
    Hello World!
    
[/code]

あるいは

[code]

    $ stack runghc -- HelloWorld.hs 
    Hello World!
    
[/code]

[Yuki Inoue
さんの回答](https://ja.stackoverflow.com/a/31826/19110)のように、この方法はより簡略化でき、また shebang
にすることもできます。  
Shebang として書いたとき、バージョン指定は以下のように行えます。

[code]

    #!/usr/bin/env stack
    -- stack --resolver lts-3.2 --install-ghc runghc
    main = putStrLn "Hello World!"
    
[/code]

(上のコードは、[James Brock](https://stackoverflow.com/users/187223/james-brock)
さんによる [Stack Overflow
への投稿](https://stackoverflow.com/a/40297909/5989200)を引用しました。)

* * *

Stack 関係なく一般的には `runhaskell` が使えます。GHC を使っているなら `runghc` も使えます。

[code]

    $ runhaskell HelloWorld.hs 
    Hello World!
    
[/code]

また、shebang を書けば実行可能ファイルとすることもできます。

[code]

    #!/usr/bin/env runhaskell
    
    main :: IO ()
    main = putStrLn "Hello World!"
    
[/code]

[code]

    $ chmod +x HelloWorld.hs 
    $ ./HelloWorld.hs 
    Hello World!
    
[/code]

## 参考

  * ["How to run a haskell file in interpreted mode"](https://stackoverflow.com/q/8676331/5989200) \-- Stack Overflow
  * ["How to Script with Stack"](https://haskell-lang.org/tutorial/stack-script) \-- Haskell Language


CC BY-SA 4.0
2017-07-14T03:37:30.343
36344
2018-10-17T05:10:27.877
2018-10-17T05:10:27.877
19110
19110
31825
answer