2011-11-28 59 views
1

Possible Duplicate:
Haskell Convert Integer to Int?鑄造整型在Haskell

INT我有一個函數來計算birthYear

birthYear :: Int -> Int 
birthYear age = currentYear - age 

currentYear :: Integral -> Integral 
currentYear year = year 

我怎麼投的體型爲int這樣birthYear可以工作?
僅供參考,年齡固定爲一個Int,因爲它來自IO,我正在使用read(年齡)函數將字符串轉換爲Int。

+0

@nponecoop這是一個很好的匹配標題,但我懷疑底層的困惑可能是不同的。 – pigworker

回答

0

對此有讀:

http://www.haskell.org/haskellwiki/Converting_numbers

從這:

Integral types are ones which may only contain whole numbers and not fractions. Int (fixed-size machine integers) and Integer (arbitrary precision integers) are the two Integral types in the standard Haskell libraries. The workhorse for converting types is fromIntegral, which will convert any integral type into any numeric type (e.g.Rational, Double, Int16...):

fromIntegral :: (Num b, Integral a) => a -> b 
+0

見我嘗試使用fromIntegral功能,使其成爲: birthYear年齡= fromIntegral(currentYear) - 年齡 但我得到的錯誤: 沒有實例(積分(整數 - >整數))從使用過程中產生fromIntegral在... –

+0

@StuartPaton:因爲'currentYear'是一個函數,而不是'Integral'值。應用'currentYear'的結果使用'fromIntegral',或者編寫它們。 – ephemient

+1

@StuartPaton錯誤消息表明(無論如何)你可能會混淆'Integer'類型(任意大數)和'Integral'類類(它收集整數,有界或其他)的表示。爲了說出生年份,你可能想要考慮'birthYear'需要什麼作爲輸入。我的意思是,我曾經是17歲,但如果你不知道我17歲的年份,那麼你無法弄清楚我出生的時間。 – pigworker

3

首先,你不能使用Integral(這是一種類)作爲一個類型。你可能的意思是:

birthYear :: Int -> Int 
birthYear age = currentYear - age 

currentYear :: Integral a => a 
currentYear = 2011 

而這只是工作。或者,如果你想有:

currentYear :: Integral a => a -> a 
currentYear year = year 

那麼這也可以工作:

birthYear :: Int -> Int 
birthYear age = (currentYear 2011) - age 

IntIntegral一個實例,所以你不必「中投」任何東西。

+0

我不能這樣做,因爲年份來自另一個函數,該函數將年份生成爲類型Integral。這是傳遞到currentYear函數,然後傳遞到birthYear函數來計算年齡。結果,這些想法都沒有奏效。 –

+4

也許你應該發佈你的真實代碼?因爲'birthYear'的上述定義完全錯誤。你從一個函數中減去'age'。 – Mitar