使用数组解析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)
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...