Próbuję napisać sobie schemat w 48-godzinnym samouczku i jako ktoś nowy w haskell jest to dość trudne. Obecnie pracuję nad problemem, w którym mam dodać możliwość analizowania wektorów schematycznych (sekcja 3.4 ćwiczenie 2).Parsowanie wektorów schematu w haskell przy użyciu tablic
używam tego typu danych:
data LispVal = Atom String
| List [LispVal]
| Vector (Array Int LispVal)
do analizowania, szukam „# (” następnie próbuje zanalizować zawartość wektorowej, upuść je na liście i przekonwertować ten wykaz array:
Próbuję użyć funkcji parsowania list, którą już posiadam i używam, ale analizuje listy schematów na liście LispVal powyżej i mam problem z przywróceniem jej do zwykłej listy. przynajmniej tak uważam mój problem:
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
a oto lista parser:
parseList :: Parser LispVal
parseList = liftM List $ sepBy parseExpr spaces
Wszelkie pomysły jak to naprawić? Dzięki, Simon
-edit- Oto błąd kompilacji otrzymuję:
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
Czy dostajesz żadnej informacji o błędzie podczas kompilacji kodu? Myślę, że definicja 'parseVectorInternals' ma błąd typu, ale nie jestem pewien, czy jest to jedyny błąd w kodzie, czy nie. Również wcięcie definicji "parseVector" jest dziwne. –
Edytowałem oryginalne pytanie w celu uwzględnienia błędu - wcięcie parsevector jest problemem renderowania, w samym kodzie jest w porządku. – SimonBolivar