Help us understand the problem. What is going on with this article?

Haskell入門のコンソールアプリを作るの備忘録

はじめに

この記事はHaskell入門を元にコンソールアプリを作るうえで書籍に登場しない情報をまとめたものです。
Haskell入門は2017年に書籍化されており、現状書籍の通りに記述していってもエラーになります(した)。
個人的には覚えたいならエラー取りつつ進めばいいと思ってるので問題ないのですが、
今後自分がHaskellに再入門する際に同じ轍を踏まないよう文書化しました。

もちろん書籍にはサンプルコードが存在しており、問題発生時にはサンプルコードを元に読み進める事ができるようになっています。
Haskell勉強したい方はHaskell入門とかもっと頭いいひとの記事を読んでください。

haskell.png
特に書くことが無かったのでHaskell書きました

9.1 開発の準備

書籍では下記コマンドを実行すると基本のディレクトリが作成されるとの事で、ディレクトリのツリーも記載されている。

stack new hjq

実際には下記差異がある。

  • ChangeLog.md
  • package.yml
  • README.md

9.2 HUnitによる自動テスト

とくに変更なし

9.3 パーサの作成

9.3.1 フィルタのデータ定義とテスト

テストを書いて初めてのstack runすると、Testが無いと怒られる。

image.png

下記対策が必要となる。

  • src/Lib.hsを削除
  • hjq.cabal編集
    • Library.exposed-modules
      • Lib削除
      • Data.Hjq追加
      • Data.Hjq.Parser追加
      • Data.Hjq.Query追加
    • Library.build-depends
      • text追加
  • test/Spec.hs
    • 先頭に{-# LANGUAGE OverloadedStrings #-}追加
    • 下記モジュールをインポート
      • Test.HUnit
      • Data.Hjq.Parser
      • Data.Hjq.Query
  • src/Data/Hjq.hs
    • 先頭にmodule Data.Hjq where追加
    • parseJqFilterを削除
  • src/Data/Hjq/Parser.hs
    • 先頭にmodule Data.Hjq.Parser where追加
    • 下記モジュールをインポート
      • Data.Text
  • src/Data/Hjq/Query.hs
    • 先頭にmodule Data.Hjq.Query wher追加
    • 適当に関数追加
  • app/Main.hs
    • import Lib削除
    • mainの中身を適当に書き変える(someFuncを使わない)

9.3.2 フィルタ文字列のパーサを書く

  • hjq.cabal
    • library.build-depends
      • attoparsec追加
  • src/Data/Hjq/Parser.hs
    • 先頭に{-# LANGUAGE OverloadedStrings #-}を追加
    • 下記モジュールをインポート
      • Data.Attoparsec.Text
      • Control.Applicative

上記修正でテストが通る。

image.png

9.3.3 クエリのデータ定義とパーサ

  • test/Spec.hs
    • mainのテストケースにjqQueryParerTestを追加

上記が無いとテストが呼ばれない。

image.png

9.4 クエリの実行とIO処理

9.4.1 lens-aesonによるJSON操作

とくに変更なし

9.4.2 フィルタの実行関数

  • test/Spec.hs
    • mainのテストケースにapplyFilterTestを追加
    • import
      • Control.Lens
      • Data.Monoid
      • Data.Text
      • qualified Data.Vector as V
      • qualified Data.HashMap.Strict as H
      • Data.Aeson
      • Data.Aeson.Lens
  • src/Data/Hjq/Query.hs
    • 先頭に{-# LANGUAGE OverloadedStrings #-}を追加
    • import
      • Control.Lens
      • Control.Monad
      • Data.Hjq.Parser
      • Data.Aeson
      • Data.Aeson.Lens
      • Data.Text as T
  • hjq.cabal
    • library.build-depends
      • vector追加
      • unordered-containers追加
      • aeson追加
      • aeson-pretty追加
      • lens-aeson追加
      • lens追加
    • test-suite.build-depends
      • text追加
      • unordered-containers追加
      • vector追加
      • aeson追加
      • aeson-pretty追加
      • lens-aeson追加
      • lens追加

9.4.3 クエリの実行関数

とくに変更なし

9.4.4 処理のまとめとI/O

  • hjq.cabal
    • library.build-depends
      • errors
      • bytestring
    • executable.build-depends
      • bytestring
      • text

image.png
やったぜ(できてない)

ふりかえり

手続き型言語のみをやってきた人間にとって、関数型言語を学ぶのは非常に時間がかかる。
経験が邪魔をする。これはxxで言うyyがまったく通用しない。
まぁ、概念を学ぶのは時間がかかって当たり前なので、逆にゆっくりのんびり学ぶ決意が固まった。

いずれ人にHaskell勧められるぐらいになれるといいなぁー。

miyatama
とりあえずなんにでも手を出す。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした