Haskell プロジェクトを作ってみる〜私のためのHaskell再入門3

stack new ry
  • して、"ry"なる名前のプロジェクトを作る。

  • のように、諸々のファイル・フォルダができる。
stack install
  • とすると、必要なパッケージを取り入れながら、回るようにしてくれる

  • このコマンドライン出力からわかるように、実行可能ファイル ry-exeをユーザのAppData....に作ってくれていて、実行すると、stack new ryコマンドが作った、プロジェクトフォルダryの下のappフォルダの中のMain.hsファイルが実行される
  • このMain.hsは書き換えなければ以下のようになっている(Mainモジュールで、Libなるモジュールをimportして、someFuncなる関数を実行するmain関数を定義している。
module Main where

import Lib

main :: IO ()
main = someFunc
  • Libはry以下のsrcフォルダにやはりデフォルトでできていて、これが、コンソールに"someFunc"なる文字列を表示させる関数sumeFuncを定義している
module Lib
    ( someFunc
    ) where

someFunc :: IO ()
someFunc = putStrLn "someFunc"
  • このプロジェクトでパッケージが使いたいなら、ry.cabalを開き、その中の"library"の下の、build-depends:のところにパッケージ名を書き加える。
library
  hs-source-dirs:      src
  exposed-modules:     Lib
  build-depends:       base >= 4.7 && < 5
  default-language:    Haskell2010
library
  hs-source-dirs:      src
  exposed-modules:     Lib
  build-depends:       base >= 4.7 && < 5
                     , GLUT
                     , OpenGL
  default-language:    Haskell2010
  • ただし、Libraryの方でGLUTやらOpenGLを使いたいのか、Main.hsの方で使いたいのかで、書き込むべきbuild-dependsは変わってくる。
  • 以下に示す例では、Main.hsにこちらのOpenGLサンプルコードを書き込んだので、executable ry2-exeのbuild-dependsに追加する
executable ry2-exe
  hs-source-dirs:      app
  main-is:             Main.hs
  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
  build-depends:       base
                     , ry2
                     , GLUT
                     , OpenGL
  default-language:    Haskell2010
  • Main.hsを次のようにする。いろいろなところのコードを試したけれど、このGLUTというのが曲者でInitialize問題というのがある。以下のソースではgetArgsAndInitializeとしているが、OS、GLUTバージョン、その他でどれが動くのかきれいな答えが無かった・・・。以下はとりあえずUbuntuで動いた。Windows7ではfreeglut問題というのもありこうすれば解決するかも、とは思ったが、試していない
  • まあ、stackベースでパッケージを使うための.cabalファイルの操作の練習だったので、(Ubuntuで)動けばよしとしよう
module Main where

import Graphics.UI.GLUT

main = do
        getArgsAndInitialize :: IO (String, [String])
        --initialize 
        initialDisplayMode $= [RGBAMode]
        initialWindowSize $= Size 500 500
        initialWindowPosition $= Position 200 200
               
        createWindow "Window Name"
        displayCallback $= myDisplay
        mainLoop

myDisplay = do
        clear [ColorBuffer]
        renderObject Wireframe ( Teapot 1.0)
        flush
  • ここまでやったら、再度
stack install
  • 実行可能ファイルができるので、実行するとteapotの絵が現れる
  • こちらでStackプロジェクトに自作モジュールを加える作業を練習してみる