我是一名有帮助的助手,以下是您需要翻译的内容:
为了解析,我正在寻找'#(',然后尝试解析向量内容,将其放入列表中并将该列表转换为数组。
我正在尝试使用一个已经存在并且正在使用的列表解析函数,但它将scheme列表解析为上面的LispVal List,我很难将其转换回常规列表。或者至少我认为我的问题是这样的。
有没有修复这个问题的想法? 谢谢, Simon
-编辑- 这是我得到的编译错误:
无法匹配预期类型a -> LispVal'与推断类型Parser LispVal'在(.)的第二个参数中,即parseList'在(.)的第二个参数中,即lispValToList . parseList'在表达式中:listToArray . lispValToList . parseList
我正在尝试完成48小时内编写Scheme教程,并且作为一个新手,Haskell对我来说非常困难。
我目前正在解决一个问题,即我应该添加解析Scheme向量的功能(第3.4节练习2)。
我正在使用以下数据类型:
data LispVal = Atom String
| List [LispVal]
| Vector (Array Int LispVal)
为了解析,我正在寻找'#(',然后尝试解析向量内容,将其放入列表中并将该列表转换为数组。
我正在尝试使用一个已经存在并且正在使用的列表解析函数,但它将scheme列表解析为上面的LispVal List,我很难将其转换回常规列表。或者至少我认为我的问题是这样的。
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
有没有修复这个问题的想法? 谢谢, Simon
-编辑- 这是我得到的编译错误:
无法匹配预期类型a -> LispVal'与推断类型Parser LispVal'在(.)的第二个参数中,即parseList'在(.)的第二个参数中,即lispValToList . parseList'在表达式中:listToArray . lispValToList . parseList
parseVectorInternals
的定义存在类型错误,但我不确定它是否是代码中唯一的错误。此外,parseVector
的定义缩进很奇怪。 - Tsuyoshi Ito