如何解决使用数组解析haskell中的方案向量
| 我正在尝试“在48小时内编写自己的方案”教程,作为一个新手,您很难理解它。 我目前正在处理一个我应该增加解析方案向量的功能的问题(第3.4节练习2)。 我正在使用以下数据类型:data LispVal = Atom String
| List [LispVal]
| Vector (Array Int LispVal)
要进行解析,我正在寻找\'#(\',然后尝试解析向量内容,将其放入列表中并将该列表转换为数组。
我正在尝试使用我已经拥有并正在使用的列表解析功能,但是它会将方案列表解析到上面的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
有想法该怎么解决这个吗?
谢谢,
西蒙
-编辑-
这是我得到的编译错误:
无法匹配预期的类型a ->
LispVal\'
against inferred type
ParserLispVal \'
(.)\' namely
parseList\'在第二个
(.)\' namely
lispValToList的参数。 parseList \”
表达式:listToArray。
lispValToList。 parseList
解决方法
您没有提供
lispValtoList
,但我想它具有以下类型
lispValtoList :: LispVal -> [LispVal]
这将建议编译器认为parseList
是a -> LispVal
类型。但这不是因为它是Parser LispVal
之类的东西,例如P String -> [(LispVal,String)]
。
您必须先提取已解析的LispVal
值,然后才能将其放入列表中。
所以parseVectorInternals
可能看起来像
parseVectorInternals = do parsedList <- parseList
let listOfLispVal = lispValtoList parsedList
return $ listToArray listOfLispVal
您可以编写更紧凑的代码,但是此代码会尝试自我记录下来;)
, parseList
是类型为parser LispVal
的Monad,而lispValtoList想要一个普通的LispVal,因此:
parseVectorInternals = listToArray . lispValtoList `liftM` parseList
如果您是我8周前读同一本书的地方,那么以下内容也将为您提供帮助:
所有这些行都是等效的:
parseVectorInternals = (listToArray . lispValtoList) `liftM` parseList
parseVectorInternals = liftM (listToArray . lispValtoList) parseList
parseVectorInternals = parseList >>= \\listLispVal -> return listToArray (lispValtoList listLispVal)
parseVectorInternals = do
listLispVal <- parseList
return listToArray (lispValtoList listLispVal)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。