Skip to content

Instantly share code, notes, and snippets.

@asufana
Last active December 14, 2015 03:03
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save asufana/558cc314ffbdbb879331 to your computer and use it in GitHub Desktop.
Haskell環境整備

Haskell環境整備

  • 2015/10時点
  • OSX Yosemite環境向け
  • 開発環境構築から単体テスト実行まで

参考

環境整備

Homebrewインストール

  • homebrewが入っていなければインストールしておくこと
//最新にしておく
$ brew doctor
$ brew update

Haskellインストール

$ brew install ghc

動作確認

$ ghci
GHCi, version 7.10.2: http://www.haskell.org/ghc/  :? for help
Prelude> 1+1
2

Cabalインストール

Haskellのパッケージ管理コマンドCabalをインストールする

$ brew install cabal-install
$ cabal update
$ cabal install cabal-install

ライブラリインストール

後述するATOMで利用するためのライブラリを入れておく

$ cabal install happy
$ cabal install haskell-src-exts
$ cabal install hlint ghc-mod stylish-haskell

サンプルプロジェクト作成

プロジェクト作成

Cabalを利用してプロジェクト雛形を作成する

$ mkdir sample
$ cd sample
$ cabal update //最新パッケージを利用するためアップデート
$ cabal sandbox init //サンドボックス環境作成
$ cabal init //プロジェクト作成
  - Please choose a license:適当に何か選択する
  - What does the package build:Executableを選択
  - その他:デフォルト値で良い

sample.cabalファイルが生成される(下記は生成ファイルに手を加えている)

name:                sample
version:             0.1.0.0
license:             Apache-2.0
license-file:        LICENSE
build-type:          Simple
cabal-version:       >=1.10

executable sample
  default-language:    Haskell2010
  ghc-options:         -Wall -fno-warn-missing-signatures -fno-warn-type-defaults
  hs-source-dirs:      src
  main-is:             Main.hs
  build-depends:       base >=4.8 && <4.9

ファイル構成

├── .cabal-sandbox
│   └── ...
├── LICENSE
├── Setup.hs
├── cabal.sandbox.config
└── sample.cabal
  • cabal initでライセンス種別を指定しておかないとLICENSEファイルが生成されず、後述のcabal installでエラーになるので注意

サンプルコード作成

$ mkdir src
$ touch src/Main.hs
$ vim src/Main.hs
main = putStrLn "hello world"

依存パッケージの取得

sample.cabalで指定された依存パッケージを取得する

$ cabal install
$ cabal configure

コード実行

$ cabal run

ATOM環境整備

パッケージインストール

ATOMのPreferenses>Installから haskell-ghc-mod ide-haskell language-haskell autocomplete-haskell linter linter-hlint パッケージをインストール

パッケージ設定

autocomplete-haskell

  • Use Backend:haskell-ghc-modを選択

haskell-ghc-mod

  • Ghc Mod Path :/Users/YOUR_NAME/.cabal/bin/ghc-mod
  • Ghc Modi Path:/Users/YOUR_NAME/.cabal/bin/ghc-modi

ide-haskell

  • One Save Prettify:有効化
  • Cabal Path:/usr/local/bin/cabal
  • Stylish Haskell Path:/Users/YOUR_NAME/.cabal/bin/stylish-haskell
  • Use Backend:haskell-ghc-modを選択
  • Use Linter:有効化

hlint

  • The hlint executable path:Users/YOUR_NAME/.cabal/bin/hlint

単体テスト(hspec)

ライブラリインストール

$ cabal install hspec

サンプルテストコード

test/HelloSpec.hs

module HelloSpec (main, spec) where

import Test.Hspec

hello :: String -> String
hello name = "hello, " ++ name

specHello :: Spec
specHello = describe "hello" $ do
    it "standard" $
      hello "world" `shouldBe` "hello, world"
    it "empty" $
      hello "" `shouldBe` "hello, "

main :: IO ()
main = hspec specHello

テスト実行

$ runhaskell test/HelloSpec.hs

cabalからテストを実行する

sample.cabal編集し、library、test-suiteを追加する

name:                sample02
version:             0.1.0.0
license:             Apache-2.0
license-file:        LICENSE
build-type:          Simple
cabal-version:       >=1.10

executable sample02
  default-language:    Haskell2010
  ghc-options:         -Wall -fno-warn-missing-signatures -fno-warn-type-defaults
  hs-source-dirs:      src
  main-is:             Main.hs
  build-depends:       base >=4.8 && <4.9

library
  default-language:    Haskell2010
  ghc-options:         -Wall -fno-warn-missing-signatures -fno-warn-type-defaults
  build-depends:       base >=4.8 && <4.9

test-suite spec
  default-language:    Haskell2010
  ghc-options:         -Wall -fno-warn-missing-signatures -fno-warn-type-defaults
  type:                exitcode-stdio-1.0
  hs-source-dirs:      test
  main-is:             HelloSpec.hs
  build-depends:       base
                     , hspec >= 1.3
                     , sample --自プロジェクトへの参照を追加しておく

ライブラリ更新

cabal install --enable-tests --only-dependencies //テスト用を含めて依存パッケージをインストール
cabal configure --enable-tests

テスト実行

cabal build
cabal test

複数ファイルのテスト

hspecのAutomatic spec discoveryを利用する (参考:http://mike-neck.hatenadiary.com/entry/2015/06/19/103536)

discovery用ファイルの配置

$ touch test/Spec.hs
$ vim test/Spec.hs
{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
$ vim sample.cabal
test-suite spec
  main-is:             Spec.hs //上記ファイルに変更

テストファイルの配置

testフォルダに *Spec.hs という名称でテストファイルを追加すれば、自動的に検出されテスト対象となる

制約

  • specファイルはテストドライバーと同じディレクトリーか、そのサブディレクトリーに置いておくこと
  • specファイルは必ずSpec.hsで終わること。また、モジュール名もSpecで終わること
  • 各モジュールは必ずトップレベルでSpecを返すspecという関数を定義すること
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment