Я не понимаю эту ошибку типа:
Couldn't match expected type `[t0]' with actual type `IO ()'
In the return type of a call of `printv'
In a stmt of a 'do' expression: px <- printv x
In the expression:
do { px <- printv x;
sep <- print ", ";
rest <- prints xs;
return (px : sep : rest) }
От:
data Value = IntValue Int
| TruthValue Bool
deriving (Eq, Show)
printv :: Value -> IO()
printv (IntValue i) = print i
printv (TruthValue b) = print ("boolean" ++ show b)
prints :: [Value] -> [IO()]
prints [] = []
prints (x:xs) = do px <- printv x
sep <- print ", "
rest <- prints xs
return (px:sep:rest)
Мне кажется, что каждый элемент (px
) преобразуется в действие IO()
, а затем добавляется к списку тех же вещей, создавая таким образом список [IO()]
.
Что мне здесь не хватает? Преобразование его в список строк путем удаления печати работает нормально.