Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 哈斯克尔从浮动到双浮动_Haskell_Functional Programming_Double - Fatal编程技术网

Haskell 哈斯克尔从浮动到双浮动

Haskell 哈斯克尔从浮动到双浮动,haskell,functional-programming,double,Haskell,Functional Programming,Double,几天来,我一直在努力学习haskell,但我看不出如何创建一个float到double的答案/输出 module SpaceAge ( Planet(..), ageOn) where -- calculate seconds to an age on different planets data Planet = Earth | Jupiter | Mars | Mercury | Neptune

几天来,我一直在努力学习haskell,但我看不出如何创建一个float到double的答案/输出

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
答案/输出将是一个浮点,但我需要一个双精度。 范例

*太空时代>水星时代2134835688
280.87936

但是我需要280.88

当然,如果我将Float更改为Double,编译器将引发错误,因为它需要一个Float。

如果需要显示结果,您可以使用


如果需要显示结果,您可以使用


我认为这里有一个误解:
280.87936
280.88
可能都是
Float
双倍。您真的需要一个
双精度
,还是要将答案四舍五入到小数点后两位?
orbitalPeriodInSeconds
不需要返回一个
浮点
;它可以返回一个多态值,其类型是
fractive
type类的实例。(
orbitalPeriodInSeconds::分数a=>Planet->a
)。这同样适用于
ageOn::Fractional a=>Planet->a->a
。可能与您所说的“如果我将Float更改为Double,编译器当然会出错”重复;我要求你验证这个假设。当我将
Float
的所有实例更改为
Double
时,编译器一点也不抱怨。“我得到了
280.87936
,但我需要
280.88
”是一个基本上不相关的问题。一个好的经验法则是“永远不要使用
Float
”。在处理某些协议、特殊硬件、数字配方时,或者在真正试图将事情紧密打包时,有一些特殊的例外,但是当你想到
Float
时,你几乎应该总是使用
Double
来代替。我认为这里有一个误解:
280.87936
280.88
可能都是
Float
Double
。您真的需要一个
双精度
,还是要将答案四舍五入到小数点后两位?
orbitalPeriodInSeconds
不需要返回一个
浮点
;它可以返回一个多态值,其类型是
fractive
type类的实例。(
orbitalPeriodInSeconds::分数a=>Planet->a
)。这同样适用于
ageOn::Fractional a=>Planet->a->a
。可能与您所说的“如果我将Float更改为Double,编译器当然会出错”重复;我要求你验证这个假设。当我将
Float
的所有实例更改为
Double
时,编译器一点也不抱怨。“我得到了
280.87936
,但我需要
280.88
”是一个基本上不相关的问题。一个好的经验法则是“永远不要使用
Float
”。在处理某些协议、特殊硬件、数字配方时,或者在真正试图将事情紧密打包时,有一些特殊的例外,但是当你想到浮动时,你几乎应该总是使用双精度。
showFFloat (Just 2) 280.87936 ""