Haskell 哈斯克尔从浮动到双浮动
几天来,我一直在努力学习haskell,但我看不出如何创建一个float到double的答案/输出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
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
答案/输出将是一个浮点,但我需要一个双精度。
范例
*太空时代>水星时代2134835688280.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 ""