Я пытаюсь использовать учебник «Напиши схему за 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
Есть идеи, как это исправить? Спасибо, Саймон
-редактировать- Вот ошибка компиляции, которую я получаю:
Не удалось сопоставить ожидаемый тип
a -> LispVal ' против предполагаемого типа
Parser LispVal 'Во втором аргументе(.) 'А именно
parseList' Во втором аргумент(.) 'а именно
lispValToList. parseList 'В выражение: listToArray. lispValToList. parseList