Write Yourself a Scheme in 48 Hours チュートリアルを試みていますが、haskell を初めて使用する人としてはかなり難しいです。私は現在、スキーム ベクトルを解析する機能を追加することになっている問題に取り組んでいます (セクション 3.4 演習 2)。
私はこのデータ型を使用しています:
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
これを修正する方法についてのアイデアはありますか? ありがとう、サイモン
-編集-これが私が得るコンパイルエラーです:
予想される型と一致しませんでした
a -> LispVal' against inferred type
Parser LispVal' parseList の 2 番目の引数(.)' namely
' の 2 番目の引数(.)' namely
lispValToList 内。parseList' 式内: listToArray 。lispValToList . parseList