使用Data.Fixed进行回合问题

时间:2013-05-20 19:33:03

标签: haskell

我在myfile.hs中定义了以下类型:

{-# LANGUAGE DeriveDataTypeable #-}
import Data.Typeable
import Data.Fixed

data E18 = E18 deriving (Typeable)
instance HasResolution E18 where resolution _ = 10^18
type MyDouble = Fixed E18

--myRound :: MyDouble > MyDouble 
--myRound x  = round x

而圆形函数在ghci中运行良好:

Prelude Data.Fixed> :load myfile.hs
Prelude Data.Fixed> round (3.1::MyDouble)
3
Prelude Data.Fixed>

如果我将以下代码附加到文件中:

myRound :: MyDouble -> MyDouble 
myRound x  = round x

我收到以下编译错误:

Prelude Data.Fixed> :load myfile.hs
No instance for (Integral MyDouble)
  arising from a use of round

有人可以告诉我如何在函数内调用它吗?

PS:你可能猜到,我是Haskell的初学者

1 个答案:

答案 0 :(得分:5)

round需要一个RealFrac并生成Integral

round :: (Integral b, RealFrac a) => a -> b

您的myRound应与round的类型相同:选择一个MyDouble并生成Int。因此,MyDouble -> Int -> MyDouble代替MyDouble -> Int,因为(我猜)最终需要的是Int

另请注意,而不是写

myRound x = round x
你可以说

myRound = round

如果您希望myRound为您生成MyDouble,那么

myRound :: MyDouble -> MyDouble 
myRound  = fromIntegral . round

应该有用。