Векторы схемы синтаксического анализа в haskell с использованием массивов

Я пытаюсь использовать учебник «Напиши схему за 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

5
задан SimonBolivar 23 June 2011 в 19:33
поделиться