Tôi đang cố gắng viết cho mình một sơ đồ trong 48 giờ hướng dẫn và như một người mới để haskell nó khá khó khăn. Tôi hiện đang làm việc về một vấn đề mà tôi phải thêm khả năng phân tích cú pháp lược đồ (phần 3.4 bài tập 2).Phân tích các vectơ lược đồ trong haskell sử dụng các mảng
Tôi đang sử dụng kiểu dữ liệu này:
data LispVal = Atom String
| List [LispVal]
| Vector (Array Int LispVal)
Để phân tích, tôi đang tìm '# (' sau đó cố gắng để phân tích các nội dung vector, thả chúng vào trong một danh sách và chuyển đổi danh sách đó để một Tôi đang cố gắng sử dụng một chức năng phân tích danh sách mà tôi đã có và đang sử dụng nhưng nó phân tích danh sách lược đồ vào Danh sách LispVal ở trên và tôi đang gặp khó khăn trong việc đưa nó trở lại danh sách thông thường. ít nhất đó là những gì tôi nghĩ rằng vấn đề của tôi là.
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
và đây là phân tích cú pháp danh:
parseList :: Parser LispVal
parseList = liftM List $ sepBy parseExpr spaces
Bất kỳ ý tưởng về làm thế nào để sửa lỗi này? Cảm ơn, Simon
-edit- Đây là lỗi biên dịch tôi nhận được:
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
Bạn có nhận được thông báo lỗi nào khi biên dịch mã không? Tôi nghĩ rằng định nghĩa của 'parseVectorInternals' có lỗi kiểu, nhưng tôi không chắc đó có phải là lỗi duy nhất trong mã hay không. Ngoài ra, sự thụt đầu của định nghĩa của 'parseVector' là lạ. –
Tôi đã chỉnh sửa câu hỏi ban đầu để bao gồm lỗi - sự phân tích cú pháp parseVector là một vấn đề hiển thị, điều này là tốt trong mã thực tế. – SimonBolivar