mightyMask score 125
2018/11/22 11:09 投稿
haskell 正規表現 |
正規表現を抽象化したコードを書きたくて、以下のようなものができました。 |
``` Haskell |
data Regex |
= Literal String -- 完全一致 |
| AnyChar -- 何かしら1文字 「.」 |
| Not Regex -- 否定 「^」 |
| And {a::Regex, b::Regex} -- aの次にb |
| Or {a::Regex, b::Regex} -- aまたはb 「|」 |
| Repeat {range::[Int], element::Regex} -- elementがrangeのいずかの個数 |
superPosition :: Regex -> Regex -- 0回か1回 「?」 |
superPosition regex = Repeat [0,1] regex |
some :: Regix -> Regix -- 1回以上繰り返し 「+」 |
some regex = Repeat [1..] regex |
oneOrMore :: Regex -> Regex -- 0回以上繰り返し 「*」 |
oneOrMode regex = Repeat [0..] regex |
match :: Regex -> String -> Bool |
match (Literal literal) string = literal == string |
match (AnyChar) string = length string == 1 |
match (Not regix) string = not $ match regix string |
-- TODO -- match (And a b) string = |
match (Or a b) string = match a || match b |
-- TODO -- match (Repeat range element) string = |
``` |
### 解決したい問題点 |
- TODOの部分の実装は今の自分の力でも無理やり実装しようと思えばできるけど、効率の良いhaskellらしいコードにするにはどんなやり方があるか。 |
- `some`とかの関数と`Or`とかのコンストラクタが利用側では同じように使えるべきだが、キャメルケースとパスカルケースで違う見た目になっている。 |
- `superPosition`とか`oneOrMore`という名前付けが他のものと一貫性が取れてない。もっと良い名前がないか? |
- `some`とか`or`とかの名前付けだと利用側で名前衝突が起こる可能性があるかも?ないかも?初心者だからこの名前付けが良いのか悪いのかも分からない。 |
- `range`に負の整数を指定できてしまう |
他にも私には分からない問題点があると思うので、そちらにもリファクタリングやマサカリをお願いします。 |
「regexは他にあるから車輪の再発明だ」っていうマサカリだけは無しでお願いします。 |
勉強のために車輪の再発明をしています。 |
勉強のために車輪の再発明をしています。 |
そもそもRegexは`String -> Bool`の型シノニムとした方がいいんですかね? |
mightyMask score 125
2018/11/22 11:05 投稿
haskell 正規表現 |
正規表現を抽象化したコードを書きたくて、以下のようなものができました。 |
``` Haskell |
data Regex |
= Literal String -- 完全一致 |
| AnyChar -- 何かしら1文字 「.」 |
| Not Regex -- 否定 「^」 |
| And {a::Regex, b::Regex} -- aの次にb |
| Or {a::Regex, b::Regex} -- aまたはb 「|」 |
| Repeat {range::[Int], element::Regex} -- elementがrangeのいずかの個数 |
superPosition :: Regex -> Regex -- 0回か1回 「?」 |
superPosition regex = Repeat [0,1] regex |
some :: Regix -> Regix -- 1回以上繰り返し 「+」 |
some regex = Repeat [1..] regex |
oneOrMore :: Regex -> Regex -- 0回以上繰り返し 「*」 |
oneOrMode regex = Repeat [0..] regex |
match :: Regex -> String -> Bool |
match (Literal literal) string = literal == string |
match (AnyChar) string = length string == 1 |
match (Not regix) string = not $ match regix string |
-- TODO -- match (And a b) string = |
match (Or a b) string = match a || match b |
-- TODO -- match (Repeat range element) string = |
``` |
### 解決したい問題点 |
- TODOの部分の実装は今の自分の力でも無理やり実装しようと思えばできるけど、効率の良いhaskellらしいコードにするにはどんなやり方があるか。 |
- `some`とかの関数と`Or`とかのコンストラクタが利用側では同じように使えるべきだが、キャメルケースとパスカルケースで違う見た目になっている。 |
- `superPosition`とか`oneOrMore`という名前付けが他のものと一貫性が取れてない。もっと良い名前がないか? |
- `some`とか`or`とかの名前付けだと利用側で名前衝突が起こる可能性があるかも?ないかも?初心者だからこの名前付けが良いのか悪いのかも分からない。 |
- `range`に負の整数を指定できてしまう |
他にも私には分からない問題点があると思うので、そちらにもリファクタリングやマサカリをお願いします。 |
「regexは他にあるから車輪の再発明だ」っていうマサカリだけは無しでお願いします。 |
勉強のために車輪の再発明をしています。 |
mightyMask score 125
2018/11/22 11:01 投稿
haskell 正規表現 |
正規表現を抽象化したコードを書きたくて、以下のようなものができました。 |
``` Haskell |
data Regex |
= Literal String -- 完全一致 |
| AnyChar -- 何かしら1文字 「.」 |
| Not Regex -- 否定 「^」 |
| And {a::Regex, b::Regex} -- aの次にb |
| Or {a::Regex, b::Regex} -- aまたはb 「|」 |
| Repeat {range::[Int], element::Regex} -- elementがrangeのいずかの個数 |
superPosition :: Regex -> Regex -- 0回か1回 「?」 |
superPosition regex = Repeat [0,1] regex |
some :: Regix -> Regix -- 1回以上繰り返し 「+」 |
some regex = Repeat [1..] regex |
oneOrMore :: Regex -> Regex -- 0回以上繰り返し 「*」 |
oneOrMode regex = Repeat [0..] regex |
match :: Regex -> String -> Bool |
match (Literal literal) string = literal == string |
match (AnyChar) string = length string == 1 |
match (Not regix) string = not $ match regix string |
-- TODO -- match (And a b) string = |
match (Or a b) string = match a || match b |
-- TODO -- match (Repeat range element) string = |
``` |
### 解決したい問題点 |
- TODOの部分の実装は今の自分の力でも無理やり実装しようと思えばできるけど、効率の良いhaskellらしいコードにするにはどんなやり方があるか。 |
- `some`とかの関数と`Or`とかのコンストラクタが利用側では同じように使えるべきだが、キャメルケースとパスカルケースで違う見た目になっている。 |
- `superPosition`とか`oneOrMore`という名前付けが他のものと一貫性が取れてない。もっと良い名前がないか? |
- `some`とか`or`とかの名前付けだと利用側で名前衝突が起こる可能性があるかも?ないかも?初心者だからこの名前付けが良いのか悪いのかも分からない。 |
他にも私には分からない問題点があると思うので、そちらにもリファクタリングやマサカリをお願いします。 |
他にも私には分からない問題点があると思うので、そちらにもリファクタリングやマサカリをお願いします。 |
「regexは他にあるから車輪の再発明だ」っていうマサカリだけは無しでお願いします。 |
勉強のために車輪の再発明をしています。 |