将IO双精度舍入到指定的位数-Haskell

将IO双精度舍入到指定的位数-Haskell,haskell,rounding,monads,Haskell,Rounding,Monads,是否有一种方法可以将IO Double四舍五入?我正在寻找一个函数: ownRound :: IO Double -> IO Double 通过这些单元测试: ownRound 0.51 == 0.5 ownRound 0.49 == 0.5 ownRound 0.5 == 0.5 ownRound 0.7132 == 0.7 ownRound 0.39 == 0.4 你所要求的东西无法得到。您编写的测试用例是针对函数的 tensRound :: Double -> Double

是否有一种方法可以将
IO Double
四舍五入?我正在寻找一个函数:

ownRound :: IO Double -> IO Double
通过这些单元测试:

ownRound 0.51 == 0.5
ownRound 0.49 == 0.5
ownRound 0.5 == 0.5
ownRound 0.7132 == 0.7
ownRound 0.39 == 0.4

你所要求的东西无法得到。您编写的测试用例是针对函数的

tensRound :: Double -> Double
ownRound :: IO Double -> IO Double
但是您编写的类型签名是针对函数的

tensRound :: Double -> Double
ownRound :: IO Double -> IO Double
如果您打算将测试用例编写为

ownRound (return 0.51) == return 0.5
ownRound (return 0.49) == return 0.5
以此类推,如果每个数字都被包装到IO中,那么这些实现就可以工作了:

tensRound :: Double -> Double
tensRound d = fromInteger (round (d*10)) / 10

ownRound :: IO Double -> IO Double
ownRound = fmap tensRound

你所要求的东西无法得到。您编写的测试用例是针对函数的

tensRound :: Double -> Double
ownRound :: IO Double -> IO Double
但是您编写的类型签名是针对函数的

tensRound :: Double -> Double
ownRound :: IO Double -> IO Double
如果您打算将测试用例编写为

ownRound (return 0.51) == return 0.5
ownRound (return 0.49) == return 0.5
以此类推,如果每个数字都被包装到IO中,那么这些实现就可以工作了:

tensRound :: Double -> Double
tensRound d = fromInteger (round (d*10)) / 10

ownRound :: IO Double -> IO Double
ownRound = fmap tensRound

你所要求的东西无法得到。您编写的测试用例是针对函数的

tensRound :: Double -> Double
ownRound :: IO Double -> IO Double
但是您编写的类型签名是针对函数的

tensRound :: Double -> Double
ownRound :: IO Double -> IO Double
如果您打算将测试用例编写为

ownRound (return 0.51) == return 0.5
ownRound (return 0.49) == return 0.5
以此类推,如果每个数字都被包装到IO中,那么这些实现就可以工作了:

tensRound :: Double -> Double
tensRound d = fromInteger (round (d*10)) / 10

ownRound :: IO Double -> IO Double
ownRound = fmap tensRound

你所要求的东西无法得到。您编写的测试用例是针对函数的

tensRound :: Double -> Double
ownRound :: IO Double -> IO Double
但是您编写的类型签名是针对函数的

tensRound :: Double -> Double
ownRound :: IO Double -> IO Double
如果您打算将测试用例编写为

ownRound (return 0.51) == return 0.5
ownRound (return 0.49) == return 0.5
以此类推,如果每个数字都被包装到IO中,那么这些实现就可以工作了:

tensRound :: Double -> Double
tensRound d = fromInteger (round (d*10)) / 10

ownRound :: IO Double -> IO Double
ownRound = fmap tensRound

fmap::(a->b)->(IO a->IO b)
是可能的。@AJFarmar,是的,我明白了。
fmap:(a->b)->(IO a->IO b)
是可能的。@AJFarmar,是的,我明白了。
fmap::(a->b)
我明白了。
fmap::(a->IO a->IO b)
是的。@AJFarmar,是的,我明白了。