gpt4 book ai didi

arrays - 使用数组在 haskell 中解析方案向量

转载 作者:行者123 更新时间:2023-12-02 08:50:04 27 4
gpt4 key购买 nike

我正在尝试在 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

关于如何解决这个问题有什么想法吗?谢谢,西蒙

-编辑-这是我得到的编译错误:

Couldn't match expected type a ->
LispVal'
against inferred type
Parser LispVal' In the second argument of (.)' namelyparseList' In the second argument of (.)' namely
lispValToList . parseList' In the expression: listToArray . lispValToList . parseList

最佳答案

您没有提供lispValtoList,但我认为它具有以下类型

lispValtoList :: LispVal -> [LispVal]

这会建议编译器认为 parseLista -> LispVal 类型。但事实并非如此,因为它是Parser LispVal,所以类似于P String -> [(LispVal,String)]

您必须先提取已解析的 LispVal 值,然后再将其放入列表中。所以 parseVectorInternals 可能看起来像

parseVectorInternals = do parsedList <- parseList 
let listOfLispVal = lispValtoList parsedList
return $ listToArray listOfLispVal

您可以编写更紧凑的内容,但此代码试图 self 记录;)

关于arrays - 使用数组在 haskell 中解析方案向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6458628/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com