Haskell を初めて使用し、パーサーを作成しようとしています。
attoparsec を使用して、入力ファイルを AST のトークンに切り分けることに成功しました。
私は今、AST を歩き回り、そこから出力を出したいと思っています。型クラスから派生させて Token クラスにいくつかの汎用ルーチンを追加し、インスタンスで必要な特定の関数を提供して Token 型に基づいてコードを発行することで、それができると考えました。
コードはおそらく私の説明よりも簡単です。これは私が試したものです:
class AST a where
children :: a -> [a]
prefix :: a -> String
suffix :: a -> String
node :: a -> [String]
children v = []
prefix v = ""
suffix v = ""
node v = [prefix v] ++ (concatMap node $ children v) ++ [suffix v]
data Token = Line { lnName :: String, lnLines :: Int }
| LineList { llLines :: [Token] }
| Init String
| Main String
| Step { stId :: String, stDuration :: Float }
| Scene { scId :: String, scTokens :: [Token] }
| Sequence { sqId :: String , sqScenes :: [Token] }
| File {flContents :: [Token]} deriving (Show, AST)
したがって、私の理解では、私が書いた型クラスから派生した場合、次のようになります。
- すべての関数にデフォルトの実装があるため、インスタンス定義を提供する必要はありません
- 必要に応じて、トークンの種類ごとにデフォルトをオーバーライドできます
しかし、ghcからエラーが表示されますが、それほど役に立ちません
Parser.hs|27 列 60 エラー| AST の派生インスタンスを作成できません
AST Token':
' は派生クラスではありません'Token' のデータ宣言内
当たり前のことですが、なぜそうなるのでしょうか?それ以上の情報なしでそれを修正する方法について途方に暮れています。感謝して受け取った助け。
これが有益なコメントではないことは承知していますが、Haskell を絶対に愛していると言わざるを得ません。学ぶことができてうれしかったです:)