Я думал, что начинаю понимать ввод-вывод в Haskell, пока не столкнулся со следующей проблемой.
I имеют следующую функцию, которая возвращает тип IO Float:
getFundPrice :: Int -> Int -> IO Float
getFundPrice fund date = do
priceList <- getFundPrice' fund date
let h = head priceList
return h
Функция getFundPrice 'использует библиотеку базы данных takusen и возвращает список типа IO [Float].
Я могу успешно протестировать функцию getFundPrice с помощью Hunit, используя следующее:
p <- getFundPrice 120 20100303
assertEqual
"get fund price"
10.286
(p)
Проблема, которая ставит меня в тупик, заключается в следующем определении функции:
lastPos :: Int -> (Shares,Float) -> Period -> Fund -> (Shares,Float)
lastPos endDate begPos [] fund = (fst begPos, trnPrice)
where trnPrice = do
price <- getFundPrice fund endDate
return price
Ошибка, которую я получаю при попытке компиляции: «Не удалось сопоставить ожидаемый тип Float 'с предполагаемым типом
IO Float'»
Я думал, что * price <- getFundPrice * Действие извлекает для меня цену, как и в случае с моим кодом HUnit.
Чем отличается использование этого в предложении where?