Haskell初心者が知っておくと便利なこと

## はじめに

- Haskellの本に書いてあることを、自分でもghciで試しながら勉強しています。

- その際に、最初から知っていれば便利だったと思われる小ネタを３つメモしました（内容はそれぞれ独立）。

- Haskellの勉強を始めた初心者の方の参考になれば幸いです。

  

## １）stack ghci起動時の設定　（ghci.confファイル）

- ghci.confというファイルにghciのコマンドを書いておくと、stack ghci起動時に実行されます。

- 毎回起動時に実行してほしいコマンドを書いておくと便利です。本の例を実行するのに、ghciを起動し直すと、同じことを設定し直さないといけない事があり面倒に感じていましが、これを設定してからはそれがなくなりました。

- ユーザフォルダの*appdata*/ghc配下においたらうまく実行してくれました（バージョンによってちょっと変わってもいるようなので、うまく行かない場合はGHCユーザーズ・ガイドを参照してください）。

  【実行例】

  ```
  $>stack ghci
  (略)
  *Main Lib>import Control.Monad.Except                     ← Monad.Exceptを勉強しようと
                                                              してインポート
  <no location info>: error:                                ← 上記がエラーになった。
      Could not load module ‘Control.Monad.Except’
      It is a member of the hidden package ‘mtl-2.2.2’.
      You can run ‘:set -package mtl’ to expose it.         ← ":set ..."するよう提案して
      　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　くれている。
      (Note: this unloads all the modules in the current scope.)
  *Main Lib>:q
  
  ----8<----8<----(この間に、下のghci.confを作成しフォルダに配置)----8<----8<----8<----
  
  $>stack ghci
  (略)
  *Main Lib> import Control.Monad.Except
  (0.00 secs, 0 bytes)                                      ← 正常に実行。
                                                            ← 実行時間も表示された。
  *Main Lib Control.Monad.Except>
  ```

  【ghci.conf設定例】

  ```
  :set -package mtl
  :set +s                ←　実行時間を表示（上記のエラーには無関係だけど、例として追加）
  ```




## ２）ghci上でのコマンドライン引数の渡し方

- ghciを起動しておいてghci上で本に載っている例を実行しながら勉強をすすめるのが便利ですが、作成したプログラムにコマンドラインで引数を渡すような場合は、一度ghciを終了するか、別のコンソール（windowsのコマンドプロンプト等）を起動してを起動して使い分ける必要があります（あると思ってました）。

- しかし、ghci上でも下記のコマンドを使えば、コマンドライン引数を渡して実行することができます（下記実行例）。

  - :main \<args>

  【実行例】

  ```
  $>stack ghci
  (略)
  Prelude>
  Prelude> :l helloname.hs
  [1 of 1] Compiling Main             ( helloname.hs, interpreted )
  Ok, one module loaded.
  *Main> :main Taro                 ← コマンドライン引数として"Taro"を使用して実行。
  Hello, Taro!
  
  ```

  【helloname.hsの内容】

  ```Haskell
  1: import System.Environment
  2: 
  3: main = do
  4:     args <- getArgs
  5:     putStrLn $ "Hello, " ++ (args !! 0) ++ "!\n"
  ```

  

## ３）デバッガ

- 少しだけでもデバッガが使用できれば、動作確認により、理解の助けになります。

- 最も使いそうなデバッガのコマンドを下に示します。

  【デバッガ関連コマンド例】

| コマンド　|内容　　　　　　　　　　                          　　|
|:-------------------------- |:----------------------------------------------|
| 【ブレークポイントの管理】|                                                   |
| :break <行数or関数の名前>   | ブレークポイントの設定                              |
| :show breaks               | ブレークポイント一覧の表示                          |
| :delete <番号>             | 番号のブレークポイントの削除。番号は上記の一覧での番号|
| :delete *                  | すべてのブレークポイントの削除                      |
| 【実行】                   |                                                    |
| :step                      | ステップ実行                                       |
| :continue                  | 次のブレークポイントまで継続実行                    |
| 【情報表示】               |                                                    |
| :list [<行数>]             | ソースコードを表示。行数を省略すると、現在行を表示。 |
| :print <identifier>        | （評価を強制せずに）値を表示                       |
| :force <identifier>        | （評価を強制し）値を表示                           |
| 【その他】                 |                                                    |
| :set stop <コマンド>       | ブレークポイント等で止まったときに、実行されるコマンドを設定 |



  【使用例（helloname.hsにデバッガを使用した例）】

```
  *Main> :break 5                                 ←ブレークポイントを設定  
  *Main> :set stop :list                          ←止まったときにソースコードを表示するよう設定
  *Main> :main Taro
  Stopped in Main.main, helloname.hs:5:5-48
  _result :: IO () = _
  4      args <- getArgs
  5      putStrLn $ "Hello, " ++ (args !! 0) ++ "!\n"
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  6
  [helloname.hs:5:5-48] *Main> :continue           ←継続実行
  Hello, Taro!
  
  ```

  

## 使用した環境

- Windows10
- stack：version 2.3.1
- ghci： version 8.8.3



----
2020/07/29 初稿: