Techいつもコードのことばかり考えている人のために。吉祥寺.pmのブログに掲載していた「Scala関数型デザイン&プログラミング」のexerciseを解く時の環境構築について、少し修正してこちらに載せ直しました。イベントブログにだけ載っているのも、もったいないな、と思って再掲。Machine)上で実行される言語です。Kit)をインストールする必要が有ります。OracleのサイトからダウンロードJDKのインストール方法はいろいろな所で解説されていますので、ここでは詳細は割愛しますが、自分の環境に合わせてOracleのサイトからインストーラをダウンロードしてインストールしてください。caskコマンドでインストールできます。以下の1行で最新版がインストールされます。javaOpenJDKのインストールLinuxの場合は、パッケージマネージャーから簡単にインストールできるOpenJDKを使った方が良いでしょう。OpenJDKyumや、aptといったパッケージマネージャーからインストールしてください。Gitのインストール「Scala関数型デザイン&プログラミング」に記載されているコード例や、例題(exercise)のヒント、解答などはすべてGitHub上のリポジトリに置かれています。そのため、サンプルコードをダウンロードするためには、Gitをインストールする必要があります。Gitのインストール方法もいろいろな所で解説されているので割愛しますが、公式サイトのドキュメントに詳しく書かれていますので、そちらを参考にしてみてください。GitのインストールmacOSではbrewコマンドでインストールします。gitサンプルコードのダウンロード任意のディレクトリに、サンプルコードのリポジトリをクローンします。https://github.com/fpinscala/fpinscala.gitこれで準備完了です。Scalaのコンパイラをインストールしていませんが、そのあたりの仕組みは次の「sbtの実行」で解説します。コードの実行準備sbtの実行ダウンロードしたサンプルコードのディレクトリに、sbt(Windows用はsbt.cmd)というコマンドが含まれていますので、まずはこれを実行します。macOSや、Linuxの場合、sbtを起動します。./sbtWindowsの場合は、sbt.cmdを起動します。Toolという身も蓋もないくらい普通の名前が付けられたScala用のビルドツールです。sbtsbt自体がScalaのコンパイラ一式をダウンロードしてくれるので、Scala自体を手動でインストールする必要はありません。sbtを起動して特にエラーが表示されなければ、準備はOKです。sbtはひじょうに高機能なビルドツールですが、のちほど説明するproject、compile、console、run、testの5つのコマンドを覚えれば、以降のexerciseのコードを実装する上では十分です。projectsbtでは一つのリポジトリで複数のプロジェクトを管理できます。そのプロジェクトを切り替えるためのコマンドです。どのようなプロジェクトが含まれているかは、projectsコマンドで確認します。compileターゲットのプロジェクトに含まれるすべてのソースコードをコンパイルします。Loop)を起動します。runScalaもJavaと同様にプログラムの実行は、main関数から始まります。runは、main関数を実行します。プロジェクト内に複数のmain関数が含まれる場合は、どのパッケージに属するmain関数を実行するか、選択するためのリストが表示されます。testJavaや、Scalaでは、テストコードはsrc/test/*ディレクトリに格納されますが、testは、testディレクトリに格納されたテストコードを実行します。PermSizeの削除macOSや、Linux環境で実行する際には、sbtコマンドを使いますが、Java8以降では不要なパラメータ(PermSize)が書かれており、実行のたびに警告メッセージが出てしまうので、Java8以降のJDKをインストールしている場合は、下記の通り書き換えることをお勧めします。sbtは単なるシェルスクリプトで、実態はsbt-launch.jarにパラメータを与えて起動しているだけです(Windows用のsbt.cmdには最初から記述は有りません)。以降、コードの実装を始めますが、サンプルコードのリポジトリは今でも日々コミットが続いています。自分が書いたコードを区別するためにも、gitのbranchを作成しておきましょう。myexecirseコードの実装サンプルコードのディレクトリ構成は大きく分けて、以下の3つに分かれています。exerciseと、answerが対になっているので、テキストエディタを上下分けて、それぞれ表示しながら進めるのがおすすめです。exercise書籍に掲載されているサンプルコードと、exerciseで書かれている関数のひな形(関数名と、引数、返値だけが書かれている)が掲載されています。最初のリストの実装であれば、以下のファイルを書き換えていく形になります。https://github.com/fpinscala/fpinscala/blob/master/exercises/src/main/scala/fpinscala/datastructures/List.scala関数のひな形が掲載されているものはコードの本体が「sys.error("todo")」となっていて、実行するとエラーになるようになっています。この「sys.error("todo")」という部分を削除して実装を始めることになります。}なぜか関数のひな形が書かれていないものや、本誌に書かれたひな形と引数名が違ったりするものも有りますが、後述のanswerに書かれている回答の関数名と、引数、返値を見ながら進めると良いでしょう。answerexerciseの回答と、その解説が書かれています。先ほどのListの回答は、以下のファイルに書かれています。https://github.com/fpinscala/fpinscala/blob/master/answers/src/main/scala/fpinscala/datastructures/List.scalaanswerkeyexerciseの回答がファイル別に置かれています。回答ごとに、ヒントも置かれているので、まずはこのヒントを見ながら実装していくと良いでしょう。コンパイルと、実行exerciseのディレクトリ配下に置かれているファイルを書き換えながら進めていくので、exerciseのディレクトリだけがコンパイルされるようにsbt上のプロジェクトを切り替えておきます。loop)が起動するので、そのまま実装したパッケージ(Listでいえば、fpinscala.datastructures)をロードすることで、実装の確認ができます。Nil))...エラーが出たり、挙動が正しく無いときは、実装の正しさを、answerか、answerkeyを参照して確認します。あとはひたすら繰り返しです。runコマンドなお、例題によってはmain関数を起動するものも有ります(第2章のgettingstartedなど)。それらのmain関数を起動するときはsbtからrunコマンドを実行します。プロジェクトの中には、複数のmain関数が有るので、どれを起動するか選択するリストが表示されます。パッケージ名を確認して、該当する番号を入力して、エンターキーを押下してください。number:実装の記録(tips)exerciseのファイルには、関数のひな形は書かれていても、対象のexerciseの番号が書かれていません。3.3」のような形式で書いておきます)。自分で気がついたところも都度コメントで残しておくと、あとで振り返ったときに便利です。章ごとに実装が終わったら、gitでコミットしておくとよいでしょう。急激に難易度が上がるところや、最初から「難問」と書かれているような例題も有りますが、そうゆうときはさっさとanswerのコードを写経して、挙動や実装の背景を理解するようにシフトした方が良いでしょう。そのときに気がついたことをひたすらコメントで残しておく方が理解が早いでしょう。テストコードの追加sbtのconsoleを使って実行結果を確認しても良いですが、いまどき実行結果はテストコードを書いて、テスト結果で確認すべきです。以下に、exerciseで書いたコードをテストコードで確認する方法を紹介します。Scalaのテスティングフレームワークとしては、ScalaTestか、Specs2がよく使われていますが、ここではScalaTestを使うことにします。ScalaTest依存ライブラリの追加Build.scalaのoptsに、ScalaTestへの依存を追加します。resolversの最後にカンマを追加するのを忘れないように。"test")テストコードの追加exercises/src/test/scala/fpinscala/datastructures/ListTest.scalaというテストコードのファイルを用意します。パスの3番目がtestになっていることに注意して下さい。Javaではおなじみですが、テストコードはtestディレクトリに保存します。3章で出てくるtailメソッドのテストコードは以下のように書けます。ScalaTestではいくつかのテストスタイルが使えますが、ここでは一番シンプルに書けるFunSuiteを使っています。equalで期待する値との比較をしています。}}テストはsbtから実行します。tailメソッドは先頭の要素を削除する...[success]...最後に[success]が出力されればテスト全体が成功したことになります。テストが一つでも失敗すると[error]が表示されます。ように3章に出てくるsetHeadメソッドのテストを追加します。NotesがGitHubのWikiに有りますので、時間に余裕があればこちらも読んでおくと参考になります。GitHubおわりに「Scala関数型デザイン&プログラミング」は非常に噛み応えが有るというか、じっくり取り組む必要が有るし、exerciseのコードを書いてみても、書いたことの意味をきちんと解説してくれる人が近くにいないと、挫折し易いというか、本当にストロングスタイルな本ですが、最後まで進めると確実に実力がつく良本ですね。見る「Scala関数型デザイン&プログラミング」はScalaの入門書ではないので、Scalaの入門書としては元祖Scalaの解説本である「Scalaスケーラブルプログラミング」の方がおすすめです。先日最新の第3版が邦訳されました。見るなお、技術書と言えば定番のO'Reillyからも何冊かScala本がリリースされていますが、邦訳がなかなかリリースされないですね。anotherなsbtランナー「sbt-extras」を使うScalaのビルドツールと言えばsbtですね。インストール自体は簡...2017-11-12「テスト駆動開発」を購入し、Scalaで写経を始めた最近話題の「テスト駆動開発」を購入した。Type-Sを買った月別アーカイブはてなブログをはじめよう!magnoliakさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。