山本悠滋
2016-03-22 Thanks God! It’s Haskell day
※このスライドは、社内勉強会で使ったものを一部加工したものです。
※理由はもう覚えてませんがが書きかけの箇所(「hoge」って書いてるところ)が何カ所かあります。
普通に何でも書けます。
ちょっとしたスクリプトでも、
Webサーバーでも、
Wiki engineでも、
ドキュメント変換器でも、
静的サイトジェネレーターでも!
Leksah
IntelliJ
のプラグイン(いわゆる、自然に存在するもののアナロジーで)
ふっつーに新しいデータ型を定義できますし、
moduleからexportしないことで、データ構造の隠蔽もできます。
「型クラス」という、インターフェースと似たものもあります。
※実際には型クラスを使わずに高階関数をうまく使えば大抵要らない、
という声も聞きますが、まぁやり方は人それぞれで。
10進数が捗る
「純粋な関数」と「イミュータブルな変数」でコードの影響範囲をコントロール!
そもそも「純粋な関数」って
unsafePerformIO
というデバッグ用に作られた例外はあります。純粋な関数じゃない・変数がミュータブルだと
result
,
いつのresult
?ちゃんと処理した後のresult
?
x
にsetしたresult
はいつまでfooResult
なの?変数がイミュータブルだと
fooResult
の定義を見たあとは参照している箇所だけに注目すればいい!純粋な関数だと
とはいえ…
そんな時に使えるの、あります。
安心してください!純粋ですよ!
integers
を受け取ってその合計を返しているだけ!それを、そのまま翻訳したようなHaskellのコード
hoge: 前述のコードを色をつけて解説
ほかにも…
すべてはMonad
というインターフェースと、
do記法という構文糖によって実現されます。
※詳細は一緒に勉強しましょう! vim(_ _)mer
とりあえず今回はこういうことができる、
ということだけ覚えていただけると!
圧倒的じゃないか我が軍は
map f (map g xs)
を
map (f . g) xs
にコンパイル時に変換この場合、y
は必要ないのでgetContents
は実行されず、入力から何も読み込まない!
hoge: 試す
何が嬉しいの?
main = do
-- 標準入力を**全部**読んで、
fileContents <- getContents
-- 行で分割して、最初の5行だけ取って、
let ls = take 5 (lines fileContents)
-- 各行の先頭に"First 5 lines: "とつけて出力
mapM_ putStrLn (map ("First 5 lines: " ++) ls)
hoge: 試す
(;_;)
IOが絡まない例でも…
"a"
のキーの値を使用した時、初めて1 + 2 + 3 ...
の部分が計算される。"b"
のキーの値を計算するための予約(「thunk
」と呼びます)は回避方法
seq
など遅延評価「しない」ための機能やライブラリを使うStrict
, StrictData
やっぱり、考え方を改めるのは難しいです。
拡張クソ多い
!!?
Javaでは普通にできる下記のようなこと
詳細は割愛しますが…
cabal
の問題をほぼ根絶。
フレームワークもいろいろありますが個人的に気になっているのを挙げますと
デプロイ時は、
Apacheなどに載せる場合はwai-handler-fastcgiが正解っぽいです。
以下はメモリのお話だけですが監視についても。
call-haskell-from-anythingというのも見つけました。
.so
ファイルとして作成新日鉄住金ソリューションズ
同社は金融機関向けの時価会計パッケージ製品「BancMeasure」をHaskellで開発した。HaskellではJavaなどと比べて短い記述が可能なため比較は難しいが、コード行数は約2万3000ステップである。プロジェクト発足時にはJavaのスキルしか持たなかった同社の10人の開発人員が、Haskellの習得期間を含めて約6カ月で製品を完成させた。
新日鉄住金ソリューションズ
単体テストの効率も向上させることができた。Haskellはコンパイラによるチェック機能が豊富なため、コンパイルが成功した後は、通常の単体テストで検出するようなバグはほとんど発生しなかったからだ。Javaでは1時間コーディングすると、単体テストやデバッグに1~3時間ほどを要するという。これらを総合し、実装工程だけで比べるとHaskellについて言われている「Javaの10倍の生産性というのは嘘ではないと実感できた」
NTTデータ
NTTデータでは、レガシーシステムのリバースエンジニアリングツールの開発においてHaskellを利用しています。レガシーシステムのリバースエンジニアリングを行うには多様なプログラミング言語の解析を行う必要があり、解析対象のプログラミング言語に合わせて、一部の機能を修正したり入れ替えたりすることが多いため、関数型プログラミングの利点を大きく享受できることが理由です。
朝日ネット
朝日ネット
つまり!