私は48時間のチュートリアルで自分自身を書くスキームを試みています。これはかなり難しいです。 私は現在、スキームベクトルを解析する機能を追加する予定の問題に取り組んでいます(セクション3.4のエクササイズ2)。配列を使ったhaskellの構文解析のベクトル
私は、このデータタイプ使用しています:
data LispVal = Atom String
| List [LispVal]
| Vector (Array Int LispVal)
を解析するには、私が探している「#(」そして、ベクトルの内容を解析リストにドロップしてにそのリストを変換しようとしています配列。
私は既に持っているが、使用しているリスト解析機能を使用しようとしていますが、上記のLispValリストにスキームリストを解析して、それを通常のリストに戻すのが苦労しています。少なくともそれは私の問題だと私は思う。
lispValtoList :: LispVal -> [LispVal]
lispValtoList (List [a]) = [a]
parseVector :: Parser LispVal
parseVector = do string "#("
vecArray <- parseVectorInternals
char ')'
return $ Vector vecArray
parseVectorInternals :: Parser (Array Int LispVal)
parseVectorInternals = listToArray . lispValtoList . parseList
listToArray :: [a] -> Array Int a
listToArray xs = listArray (0,l-1) xs
where l = length xs
この問題を解決する方法について
parseList :: Parser LispVal
parseList = liftM List $ sepBy parseExpr spaces
任意のアイデア:
、ここではリストパーサですか? おかげで、 サイモンここ
-edit- は私が手コンパイルエラーです:
Couldn't match expected type
a -> LispVal' against inferred type
Parser LispVal' In the second argument of(.)' namely
parseList' In the second argument of(.)' namely
lispValToList . parseList' In the expression: listToArray . lispValToList . parseList
すべてのエラーメッセージが表示されますか?私は 'parseVectorInternals'の定義に型エラーがあると思いますが、コード内の唯一のエラーかどうかはわかりません。また、 'parseVector'の定義の字下げは奇妙です。 –
元の質問を編集してエラーを組み込みました - parseVectorインデントはレンダリングの問題です。実際のコードで問題ありません。 – SimonBolivar