Я думал, что начинаю понимать IO в Haskell, пока не столкнулся со следующей проблемой.
У меня есть следующая функция, которая возвращает тип 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' against inferred type
IO Float '»
Я думал, что действие * цена <- getFundPrice *</em> извлечет цену для меня, как это происходит с моим кодом HUnit.
Чем отличается использование в предложении where?