我正在尝试在 48 小时内编写自己的计划教程,作为一个新的 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
有想法该怎么解决这个吗?谢谢,西蒙
-edit- 这是我得到的编译错误:
无法匹配预期类型
a -> LispVal' against inferred type
Parser LispVal' 在 parseList 的第二个参数中(.)' namely
' 在 lispValToList 的第二个参数中(.)' namely
。parseList' 在表达式中: listToArray 。lispValToList 。解析列表