Вы смешиваете IO
с чисто не IO
функциями.
getVectorData vector1 = do
putStrLn "Enter dimension and coefficient separated by a space: Enter \"Done\" to move on to next vector: "
appData <- getLine
if appData == "done" then
putStrLn "That's it"
Все вышеперечисленное IO
else do
createVectorTuple (words appData) : vector1
createVectorTuple
- это не- IO
функция. Поскольку предыдущая часть является блоком do IO
, в этом блоке do могут появляться только выражения типа IO a
. Тем не менее, вы получаете несколько странное сообщение об ошибке, потому что приоритет приложения функции является наивысшим, поэтому строка выше анализируется
(createVectorTuple (words appData)) : vector1
, который является выражением типа [(String, Float)]
(если vector1
имеет этот тип). Теперь []
также является монадой, поэтому выражения типа [a]
могут появляться в do-блоках, но тогда все выражения в этом блоке должны иметь тип списка. Но
getVectorData vector1
является выражением типа IO ()
, как было определено в приведенной выше части. Таким образом, типы не совпадают. По общему признанию, сообщенная ошибка типа не является самой ясной возможной в этой ситуации.
Вы, вероятно, хотите что-то вроде
let vector2 = createVectorTuple (words appData) : vector1
getVectorData vector2
или что-то совсем другое, я не могу сказать по короткому фрагменту.