読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

第2期 第7回 H本読書会 in 秋葉原 #readhbon

Haskell 勉強会

第2期 第7回 H本読書会 in 秋葉原 - H本読書会(Haskell勉強会) | Doorkeeper

前回のラブライブ!

embedがうまくいかないので修正しました。

http://shigemk2.hatenablog.com/entry/2015/02/04/

5.4 ラムダ式

ラムダ式とは、1 回だけ必要な関数を作るときに使う無名関数です。

ラムダ式を宣言するには、バックスラッシュ( \ )を書いて、それから関数の引数をスペース区切りで書きます。

numLongChains.hs

5.5 畳み込み、見込みアリ!

  • foldr
  • foldl

fold_examples.hs

リストは無限であってもたたみこめる。わかったようなわからないような。無限リスト foldrなら可能でfoldlだと無理。

スキャンなど

sqrtSums.hs

5.6 $ を使った関数適用

$で区切ると関数の適用順序が微妙にかわる。

doll.hs

5.7 関数合成

関数合成の基本

synthesis.hs

ポイントフリースタイル

pointfreestyle.hs

最後らへんは割と駆け足だった。

第6章 モジュール

Haskell のモジュールは、いくつかの関数や型、型クラスなどを定義したファイルです。Haskellプログラムはモジュールの集合です。

また、

自分のコードを相互に強く依存しない(疎結合ともいいます)モジュールに分割しておけば、後でモジュールごとに再利用できます。

packages by category | Hackage

6.1 モジュールをインポートする

nub

nub.hs

length . nubの関数合成

length.hs

importの方法など。

import qualified Data.Map as M

Haskell について新しい知識を仕入れる最良の方法は、標準ライブラリのドキュメントにアクセスし、そのモジュールと関数を散策することです。各モジュールのソースコードを見ることもできます。モジュールのソースコードをいくつか読めば、Haskellに対する確かな感覚が身に付くでしょう。

6.2 標準モジュールの関数で問題を解く

単語を数える

normal_module.hs

干し草の山から針を探す

haystack.hs

シーザー暗号サラダ

シーザー暗号ですな。

caesar.hs

正格な左畳み込みにて

foldl はコンピュータのメモリの特定の領域を使いすぎたときに起こる、スタックオーバーフローエラーを引き起こすことがあるのです。

また、

100 万の要素を含むような大きなリストでは、先延ばしにしていた計算がすべて再帰的に行われるので、スタックオーバーフローという結果になってしまいます。

foldl (+) 0 (replicate 1000000 1)

64ビットマシンだとスタックオーバーフローが起きないからたんにメモリを食いまくって面倒なことになるだけだった。

Data.Listのfoldl'だとすぐにメモリを開放してくれるからよい。

それでも数が増え過ぎると遅いけど。

foldl' (+) 0 (replicate 10000000000 1)

かっこいい数を見つけよう

各桁の数の合計が 40 になる最初の自然数はなにか。

findとdigitToIntを使います。

Maybe a 型の値は、0 個かちょうど 1 個の要素だけを持てます。この型は、失敗する可能性があることを表現するのに使います。何も持っていないという値を作るには Nothingを使います。

Haskell Maybeモナド 超入門 - Qiita

firstTo40.hs

例外を使おうよ、突然プログラムを終了するのをやめようよっていうのが、Just Maybe Nothingのはじまり。

f:id:shigemk2:20150218211047p:plain

Haskellはわりと柔軟なので、関数の結果を関数に渡せる。

f:id:shigemk2:20150218210645p:plain

Maybeの存在価値について。

本物のプログラマはHaskellを使う - 第5回 ListではなくMaybeを使う意義:ITpro

6.3 キーから値へのマッピング

だいたい大丈夫(連想リスト)

集合のようなデータを扱うときは、その順序を気にしたくない場合もあります。単にキーでアクセスしたい場合などです。

ここいらでエラーハンドリング的にMaybeが使われている。

findKey.hs

これは、連想リスト(Map)のlookup関数を再実装したもの。

Data.Map に潜入せよ

phoneBook.hs

Prelude

型クラスは最初の方に出てきた。

データと型クラスとそのインスタンス。

f:id:shigemk2:20150218213312p:plain

$ で折り返しているのはなんとなくっぽい。

phoneBook.hs

phoneBookMap.hs

mapmaximum.hs

この次はモジュールを自作してみようっていう話。