Skip to content

Commit d8d3730

Browse files
committed
Update regex-applicative.md
1 parent 47b3fd2 commit d8d3730

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

preprocessed-site/posts/2019/regex-applicative.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,11 @@ stack build regex-applicative
5757
stack exec ghci
5858
```
5959

60-
<small>(最近の)</small>`cabal`の場合は`cabal.project`があるディレクトリーで👇を実行すればできるはずです。
60+
<small>(最近の)</small>`cabal`の場合は👇を実行すればできるはずです。
6161

6262
```bash
63-
cabal v2-install --lib regex-applicative
64-
cabal v2-repl -b regex-applicative
63+
cabal v2-install --lib regex-applicative
64+
cabal v2-repl -b regex-applicative
6565
```
6666

6767
GHCiが起動したら、こちらの`import`文を張って、本記事のサンプルを実行する準備をしてください。
@@ -106,7 +106,7 @@ Just 'b'
106106

107107
と書けば、文字クラスっぽいことができます。
108108

109-
## 空文字(ε): `pure` :: a -> RE s a
109+
## 空文字(ε): `pure :: a -> RE s a`
110110

111111
正規表現に欠かせない、空文字(ε)を表す正規表現も作れます。
112112
`Applicative`型クラスの`pure`で表現します。
@@ -253,7 +253,7 @@ URLのスキームにマッチさせるために、「`http`の後にオプシ
253253
<* string "://"
254254
```
255255

256-
`<*`を使うことで、`://`の部分にはマッチさせてもマッチした結果は無視している点にご注意ください
256+
`<*`を使うことで、`://`の部分にはマッチしてもマッチした結果は無視している点にご注意ください
257257
regex-applicativeはこのように、「マッチしたら関数に渡す文字列」と「マッチしても関数に渡さない文字列」をユーザーが書き分けられるようになっているので、他の正規表現ライブラリーにあるようなキャプチャー[^capture]や、先読み言明・後読み言明などの機能が必要ないのです。
258258

259259
[^capture]: 正確には、キャプチャーした文字列を正規表現の中で再利用することができないので、他の正規表現ライブラリーのキャプチャー機能と完全に同等のことができるわけではありません。これは現状のregex-applicativeの制限です。
@@ -302,7 +302,7 @@ Just (Origin {scheme = "https", host = "example.com", port = 8080})
302302
Just (Origin {scheme = "http", host = "example.com", port = 80})
303303
```
304304

305-
regex-applicativeを使うことで、URLのオリジンにマッチさせるだけでなく、待ちした結果を`Origin`型の値として割り当てる正規表現が作れました!🎉
305+
regex-applicativeを使うことで、URLのオリジンにマッチさせるだけでなく、マッチした結果を`Origin`型の値として割り当てる正規表現が作れました!🎉
306306

307307
# 👍regex-applicativeのメリット
308308

@@ -324,7 +324,7 @@ regex-applicativeパッケージには、他の正規表現ライブラリーと
324324
- 専用のメタキャラクターより分かりやすい、とも言える
325325
- ユーザーからの入力として、正規表現を受け取ることは難しい
326326
- これも内部DSLなのでやむなし
327-
- 速度はおそらくCとかで書いたものほど速くはない
327+
- おそらくCとかで書いたものほど速くはない
328328
- そんなに細かい最適化をしているわけではないし、Pure Haskellなので...
329329
- `String`以外の文字列にはマッチできない...
330330
- これがHaskellerにとって一番痛い
@@ -365,7 +365,7 @@ regex-applicativeでは先ほど紹介した`psym`関数のように、「任意
365365
## regex-applicativeの実際の実装
366366

367367
さらにregex-applicativeの実装を掘ってみましょう。
368-
先ほど紹介した`compile`関数は、正規表現オブジェクト`RE s a`[`ReObject s r`](https://github.com/feuerbach/regex-applicative/blob/5e9a06622d33c7657353ddaccfe101b96946027a/Text/Regex/Applicative/Object.hs#L38-L43)という型の、[`Thread s r`](https://github.com/feuerbach/regex-applicative/blob/5e9a06622d33c7657353ddaccfe101b96946027a/Text/Regex/Applicative/Types.hs#L9-L16)の値のキューに変換します
368+
先ほど紹介した`compile`関数は、正規表現オブジェクト`RE s a`[`ReObject s r`](https://github.com/feuerbach/regex-applicative/blob/5e9a06622d33c7657353ddaccfe101b96946027a/Text/Regex/Applicative/Object.hs#L38-L43)という型の、[`Thread s r`](https://github.com/feuerbach/regex-applicative/blob/5e9a06622d33c7657353ddaccfe101b96946027a/Text/Regex/Applicative/Types.hs#L9-L16)型の値のキューに変換します
369369
これがregex-applicativeにおけるNFAと呼べそうですね。
370370

371371
```haskell
@@ -490,7 +490,7 @@ Just 12345
490490
Fail "" [] "not enough input"
491491
```
492492

493-
理由は先ほどと同様で、最初に書いた`many anyChar`がすべての文字列を消費してしまい、それ以降の`decimal`などがマッチできないのです
493+
理由は先ほどと同様で、最初に書いた`many anyChar`がすべての文字列を消費してしまい、それ以降の`decimal`などがマッチできないためです
494494
正しく処理するには、「`decimal`の先頭以外の文字列」、すなわち「数字以外の文字列」が`many`であることを明示する方法をとるしかありません[^regex]
495495

496496
[^regex]: ただし、一般に、正規表現ライブラリーであってもこのような書き方をした方が効率よくマッチさせやすいでしょう。

0 commit comments

Comments
 (0)