2016-12-05 21 views
0

我一直在努力学习的Haskell几天,但我不能看到弄清楚如何创建应答/输出这是一个浮动,以一个双哈斯克尔从浮到双

module SpaceAge (Planet(..), ageOn) where 
-- calculate seconds to an age on different planets 
data Planet = Earth 
      | Jupiter 
      | Mars 
      | Mercury 
      | Neptune 
      | Saturn 
      | Uranus 
      | Venus 

-- one year has 31557600 seconds 
orbitalPeriodInSeconds :: Planet -> Float 
orbitalPeriodInSeconds planet = 31557600 * multiplier where 
    multiplier = case planet of 
     Earth -> 1.0 
     Jupiter -> 11.862615 
     Mars -> 1.8808158 
     Mercury -> 0.2408467 
     Neptune -> 164.79132 
     Saturn -> 29.447498 
     Uranus -> 84.016846 
     Venus -> 0.61519726 

-- user input example: ageOn Venus 9303000 
ageOn :: Planet -> Float -> Float 
ageOn planet seconds = seconds/orbitalPeriodInSeconds planet 

答案/输出将是一个浮点数,但我需要得到一个double。 例

* 4,1> ageOn水星2134835688
280.87936

但我需要280.88
Offcourse如果我改变浮动为Double,因为它期待一个浮动的编译器会引发错误。

+5

我觉得有一个误解,在这里:'280.87936'和'280.88'可以都'Float' *或*'Doubles' 。你真的需要一个'Double',还是你想回答两个小数点? –

+1

'orbitalPeriodInSeconds'不需要返回'Float';它可以返回一个多态值,其类型是'Fractional'类类的一个实例。 ('orbitalPeriodInSeconds :: Fractional a => Planet - > a')。 'ageOn :: Fractional a => Planet - > a - > a'也是一样。 – chepner

+0

可能是http://stackoverflow.com/questions/1559590/haskell-force-floats-to-have-two-decimals –

回答

3

如果需要的是显示效果可以用showFFloatNumeric

showFFloat (Just 2) 280.87936 ""