質問編集履歴

3 解決案の提案

mightyMask

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`の型シノニムとした方がいいんですかね?
  • Haskell

    117 questions

    Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

2 解決したい問題点の追加

mightyMask

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は他にあるから車輪の再発明だ」っていうマサカリだけは無しでお願いします。
勉強のために車輪の再発明をしています。
  • Haskell

    117 questions

    Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

1 追加

mightyMask

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は他にあるから車輪の再発明だ」っていうマサカリだけは無しでお願いします。
勉強のために車輪の再発明をしています。
  • Haskell

    117 questions

    Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る