我在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的初学者
答案 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
应该有用。