2013-05-20 71 views
3

我在myfile.hs規定的下列類型:問題與輪Data.Fixed

{-# 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

通知'round'可能不圓你想'round'四捨五入的方式。要圍繞你想旋轉的方式,然後考慮使用「floor」或「ceiling」而不是「round」進行四捨五入,這意味着即使是最接近的圓形也是如此。回合。 –

+0

@ ThomasM.DuBuisson令人敬畏的使用這個詞圓。真棒。 – AndrewC

回答

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 

應該工作。

+0

謝謝,我以爲是圓形的MyDouble-> MyDouble ... – kevin

+2

不客氣:)在GHCi中使用':t''''''''''''''''''''''''''可以爲您節省相當多的時間。 –