4

私は持っていてdata RegEx、実装したいと思っていますinstance Show a => Show RegEx a。これが私のコードです:

showAtom :: Show a => RegEx a -> String
showAtom (Lit x) = show x
showAtom r       = "(" ++ (show r) ++ ")"

instance Show a => Show (RegEx a) where
    show (Lit x)   = show [x]
    show (Opt r)   = (showAtom r) ++ "?"
    show (Alt p q) = (showAtom p) ++ "|" ++ (showAtom q)
    show (Seq p q) = (show p) ++ (show q)
    show (Rep r)   = (showAtom r) ++ "*"

showAtom関数は単なる実装の詳細です。instance定義内でのみ表示されるように、非表示にする方法はありますか? またはさらに良いのは、 内でのみ表示できるようにすることshowです。

4

3 に答える 3

1

モジュールをエクスポートしないことでモジュールに対してローカルにすることができますがshowAtom、それでもインスタンスやshow関数だけでなく、モジュール全体で表示されます。

関数に対してローカルにするには、orshowを使用する必要がありますが、関数のパラメーター リストでパターン マッチングを使用する場合、どちらも複数のケースには適用されません。パターン マッチングを次のようなステートメントに移動することで機能させることができます。letwherecase

instance Show a => Show (RegEx a) where
    show re =
      let
        showAtom :: Show a => RegEx a -> String
        showAtom (Lit x) = show x
        showAtom r       = "(" ++ (show r) ++ ")"
      in
        case re of
          (Lit x)   -> show [x]
          (Opt r)   -> (showAtom r) ++ "?"
          (Alt p q) -> (showAtom p) ++ "|" ++ (showAtom q)
          (Seq p q) -> (show p) ++ (show q)
          (Rep r)   -> (showAtom r) ++ "*"
于 2013-04-27T21:21:37.420 に答える