我在48小時的教程中嘗試編寫自己的方案,並且作爲haskell的新成員,這非常困難。 我目前正在研究一個問題,我應該添加解析方案向量的能力(3.4節練習2)。在使用數組的haskell中解析方案向量
我使用這個數據類型:
data LispVal = Atom String
| List [LispVal]
| Vector (Array Int LispVal)
要解析,我在尋找「#(」然後試圖解析向量內容,在列表中把它們和列表轉換成array。
我想使用列表解析功能,我已經有了,但它解析方案列表到上面的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
關於如何解決此問題的任何想法? 謝謝, 西蒙
CNC中 這裏的編譯錯誤,我得到:
Couldn't match expected type
a -> LispVal' against inferred type
Parser LispVal' In the second argument of(.)' namely
parseList' In the second argument of(.)' namely
lispValToList . parseList' In the expression: listToArray . lispValToList . parseList
你得到任何錯誤消息,當您編譯代碼?我認爲'parseVectorInternals'的定義有一個類型錯誤,但我不確定它是否是代碼中唯一的錯誤。另外,'parseVector'定義的縮進很奇怪。 –
我編輯了原始問題以包含錯誤 - parseVector indenting是一個呈現問題,在實際代碼中很好。 – SimonBolivar