2013-04-08 5 views
0

Как часть большого проекта в университете написать переводчика в Haskell для простого пользовательского языка, я пытаюсь напечатать некоторые вещи, чтобы помочь мне в моих поисках написать эту вещь ,Отображение списка в произвольном виде данных

Там же типа данных

data Prog = Prog [Func] 
    deriving (Show, Read) 

и когда я пытаюсь напечатать экземпляр этой проги в последней строке этой функции

interpret :: Prog -> Vars -> String -> MaybeDebug -> IO() 
interpret prog vars entry _ = do 
    putStrLn "The interpreter isn't written yet. Better get onto that!" 
    putStrLn "\n\n" 
    putStrLn (show prog) 
    putStrLn "\n\n" 
    putStrLn (show vars) 
    putStrLn "\n\n" 
    putStrLn (show entry) 
    putStrLn "\n\n" 
    putStrLn (map show [func | func <- prog, (func_name func) == entry]) 

Я получаю сообщение об ошибке «Не удалось соответствовать ожидаемый тип «Char» с фактическим типом «String».

Я пытаюсь в течение некоторого времени решить, в чем проблема. Почему он упоминает символы, когда это понимание списка возвращает список funcs?

ответ

10
map show [func | func <- prog, (func_name func) == entry] 

выдает список String с, но putStrLn принимает один String или [Char], в качестве аргумента.

Таким образом, ожидаемым типом элементов списка является Char, но фактический тип String.

В зависимости от того, что выход вы хотите, последняя строка должна быть чем-то вроде

putStrLn (unlines $ map show [func | func <- prog, (func_name func) == entry]) 

или

mapM_ putStrLn (map show [func | func <- prog, (func_name func) == entry]) 

(что было бы лучше

mapM_ print [func | func <- prog, (func_name func) == entry] 

однако).

Затем в списке понимания, когда вы пишете func <- prog, prog должен быть список, но аргумент interpret является Prog, список завернутые в конструкторе Prog. Вам нужно разворачивать список, чтобы использовать его в списке понимания, например

interpret [email protected](Prog functions) vars entry _ = do 

с как-шаблон, а затем

func <- functions 

в списке понимания.

+0

Хорошо, спасибо, что имеет смысл. Однако теперь Haskell жалуется, что он не может соответствовать ожидаемому типу «[t0]» с фактическим типом «Prog». Это проблема, которую, как я думал, я исправил, представив показ карты, но похоже, что она просто замаскировала его. Неужели у вас тоже столь же удивительно простое объяснение этого затруднения? – nebffa

+1

Обновлено с возможным исправлением для этого. –

+0

Привет, огромное спасибо.Ваши объяснения действительно ясны, теперь это имеет смысл. – nebffa

1

Как заявил Дэниел, проблема в том, что putStrLn ожидает строку, а не список строк.

Предлагаю интеркалировать, чтобы распечатать список, разделенный запятой.

putStrLn (intercalate ", " (map show [func | func <- prog, (func_name func) == entry])) 

Вам необходимо импортировать Data.List, чтобы получить интеркалирующую функцию.

Смежные вопросы