2015-04-22 48 views
0

有没有办法绕IO Double?我在寻找一个功能:Round IO Double到指定的位数 - Haskell

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 
+0

'fmap ::(a - > b) - >(IO a - > IO b)'是可能的。 – AJFarmar

+0

@AJFarmar,是的,我明白了。 – Denis

回答

3

你所要求的不能了。你写的测试用例的功能

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 
+0

@kgr,谢谢。有用! – Denis