IO in where clause

Я думал, что начинаю понимать ввод-вывод в 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?

5
задан Asalle 4 December 2017 в 13:23
поделиться