2014-01-28 6 views
1

У меня возникает эта проблема, функция вычисляет принимает IO типа, и у меня уже есть функция , которая возвращает то же самое, но принимает ее как ее тип. Ниже мой код. Я искал по сети в течение некоторого времени, но мне не удалось исправить мою ошибку. Спасибо за вашу помощь.Использование аргументов IO monad без IO

pureCalculate :: Expr (Double -> Double -> Double) -> Map.Map String Double -> Double 

calculate :: IO(Expr (Double -> Double -> Double)) -> Map.Map String Double -> IO Double 

calculate expr args = 
    do let x = pureCalculate expr args 
     return x 

ответ

6

Я считаю, что вы хотите сделать что-то вроде

calculate ioexpr args = do 
    expr <- ioexpr 
    return $ pureCalculate expr args 

Для того, чтобы использовать значение, завернутые в IO монады, вы должны сначала извлечь его с помощью <- обозначения, или вы можете использовать другие функции например fmap, чтобы отобразить функцию в содержимое.

Если вы хотите использовать fmap в этом случае, вы могли бы сделать что-то вроде

calculate ioexpr args = fmap (\expr -> pureCalculate expr args) ioexpr 

что эквивалентно

calculate ioexpr args = fmap (`pureCalculate` args) ioexpr 

или

calculate ioexpr args = fmap (flip pureCalculate args) ioexpr 
Смежные вопросы