2017-06-06 66 views
0

我有定義一個函數的類型的問題。在1,10,11和12的情況下,我插入一個Int並返回一個浮點數,但在插入一個Int並返回一個Int類型不匹配的情況下。 我試着用 pointsForSeventy ::內部 - > float並與pointsForSeventy ::房地產A->內部 - >一個(我以爲這人會工作,因爲積分和小數形式是實數內)定義函數 - INT的類型和漂浮在Haskell的

pointsForSeventy 1 = 5.5 
pointsForSeventy 10 = 0.5 
pointsForSeventy 11 = 0.5 
pointsForSeventy 12 = 0.5 
pointsForSeventy a = a 

在此先感謝

+0

你的第二個想法是句法上的錯誤,應該是'pointsForSeventy :: Real a => Int - > a',它是從'Int'到'a'的函數,其中'a'是'Real '。注意約束後的胖箭頭('=>'not' - >')。 –

回答

3

你需要一個明確的轉換:

pointsForSeventy 1 = 5.5 
pointsForSeventy 10 = 0.5 
pointsForSeventy 11 = 0.5 
pointsForSeventy 12 = 0.5 
pointsForSeventy a = fromIntegral a 

不像其他幾種編程語言,哈斯克爾不會自動進行數字類型之間的自動或隱式轉換。

在另一方面,數字文字屬於任何數值類型。例如。 1/2*0.5 :: Double將返回0.25,因爲所有三個文字都是Double s。在某些語言如C中,相反,1/2*0.5的計算結果爲0,因爲1/2是整數除法(!),並且計算結果爲0

+0

感謝您的回答,問題是我需要以這種方式澄清pointsForSeventy :: - > – cde33

+1

@ cde33除非你讓'pointsForSeventy :: Double - > Double',否則你不能在類型級別修復它,或者類似的東西,涉及輸入和輸出相同的浮點類型。 – chi

4

Haskell是一種靜態類型語言。因此,這意味着,返回類型可以取決於輸入的

一個想法可能是通過使用fromIntegral :: (Integral a, Num b) => a -> bInt轉換成Float

pointsForSeventy :: Int -> Float 
pointsForSeventy 1 = 5.5 
pointsForSeventy 10 = 0.5 
pointsForSeventy 11 = 0.5 
pointsForSeventy 12 = 0.5 
pointsForSeventy a = fromIntegral a

如果你想治療Int情況下,從Float情況不同,你也可以使用Either

pointsForSeventy :: Int -> Either Float Int 
pointsForSeventy 1 = Left 5.5 
pointsForSeventy 10 = Left 0.5 
pointsForSeventy 11 = Left 0.5 
pointsForSeventy 12 = Left 0.5 
pointsForSeventy a = Right a