Вы не хотите, чтобы prints
возвращал массив действий ввода-вывода. Вы хотите, чтобы он возвращал одно действие ввода-вывода, которое представляет каждое из связанных действий ввода-вывода. Что-то вроде:
prints xs = mapM_ (\x -> printv x >> putStr ", ") xs
За исключением того, что я не думаю, что новые строки будут заканчиваться там, где вы хотите.
Посмотрите документацию для mapM
и sequence
для получения дополнительной информации. В частности, реализация последовательности, вероятно, похожа на то, что вы пытаетесь сделать.
Однако я действительно рекомендую вместо того, чтобы выполнять всю работу в функции ввода-вывода, написать чистую функцию для визуализации желаемого текстового формата, а затем просто распечатать его. В частности, кажется, что экземпляр Show
для Value
будет уместным.
instance Show Value where
show (IntValue i) = show i
show (TruthValue b) = "boolean " ++ show b
Таким образом, вы можете просто позвонить print value
, а не printv value
, и если вы действительно этого хотите, вы можете определить prints
следующим образом.
import Data.List
prints :: (Show a) => [a] -> IO ()
prints = putStrLn . intercalate ", " . map show`.