Yuji Yamamoto (山本悠滋)
2019-10-18 Regex Festa
Applicative
やAlternative
という型クラスのメソッドが中心なので慣れていればわかりやすいマッチさせるのに使う関数(他にもある)
RE s a
型の値と、対象の文字列
[s]
型の値を受け取ってマッチした結果を返す
ただの文字: sym
> match (sym 'a') "a"
Just 'a' -- 成功したら `Just ...` な値を返す
> match (sym 'a') "b"
Nothing -- 失敗したら `Nothing` を返す
連接: *>
・string
> match (sym 'a' *> sym 'b') "ab"
Just 'b'
-- マッチする文字列は同じ、より分かりやすいバージョン
> match (string "ab") "ab"
Just "ab"
選択: <|>
繰り返し: many
・some
many
、1回以上がsome
オプショナルなマッチ: optional
> match (sym 'a' *> optional (sym 'b')) "ab"
Just (Just 'b')
> match (sym 'a' *> optional (sym 'b')) "a"
Just Nothing
マッチした結果をHaskellの値に割り当て
> match digit "1"
Just 1 -- マッチした結果が整数として返ってくる!
> match (many digit) "12345"
Just [1,2,3,4,5] -- マッチした結果が整数のリストに!
マッチした結果をHaskellの値に割り当て、さらに計算!
<$>
:
左辺に渡した関数を、右辺に渡した正規表現でマッチした結果に渡すもうちょっと複雑な例: まずは部品作り
<$>
や<*>
でOrigin
関数一つ一つの引数に割り当てる<|>
とpure
を使うとマッチに失敗した場合のデフォルト値を指定できる
pure
:
空文字列にしかマッチしないけど値は返す正規表現を作るもうちょっと複雑な例: まずは部品作り(続き)
もうちょっと複雑な例: 使ってみる
> match originRe "https://example.com:8080"
Just (Just 8080) -- マッチが成功してポート番号がとれた
> match originRe "http://example.com"
Just Nothing -- マッチは成功したけどポート番号はとれなかった
マッチ結果の構造体への割り当て: まずは構造体の定義
> match originRe "https://example.com:8080"
Just (Origin {scheme = "https", host = "example.com", port = 8080})
> match originRe "http://example.com"
Just (Origin {scheme = "http", host = "example.com", port = 80})
String
以外の文字列にはマッチできない…
※正規表現技術入門 p. 56より
😕どちらでもなさそう?
compile
という関数で、正規表現オブジェクトRE s a
をReObject
という、Thread
オブジェクトのキューに変換するThread
は👇の二通りの値をとりうる型
s -> [Thread s r]
:
文字を受け取って次に分岐しうるThread
のリストを返す関数。文字が条件にマッチしなければ空リストを返して次に進まないAccept r
: 文字どおり受理状態を表すs -> [Thread s r]
の実行が成功したとき
[Thread s r]
の要素をすべてキューに追加して、引き続き実行するs -> [Thread s r]
の実行が失敗したとき
Thread
に切り替えるThread
を一つずつ実行してみて、結果が条件に合うものを選ぶ、といった方が近い
findLongestPrefix
関数などはそうした処理特性によって実現Applicative
ベースのAPIなので、ぱっと見よく似てる
Space, Right Arrow or swipe left to move to next slide, click help below for more details