2010-02-20 54 views
5

我有一個Haskell函數計算有限INTS的列表的大小。我需要的輸出類型是整數,因爲該值將實際上比結合Int的最大值(其結果將是-1確切如果輸出類型是一個Int)哈斯克爾錯誤:無法滿足預期的類型'整「反對推斷類型'詮釋」

size :: a -> Integer 
size a = (maxBound::Int) - (minBound::Int) 

我理解的Ints(有界)和整數(無界)之間的差異,但我想從一個整數。我想知道是否有像fromInteger這樣的函數,這將允許我將Int轉換爲Integer類型。

+0

你沒有使用'了'。 – kennytm 2010-02-20 08:42:21

+0

(在@dons重。最後一個問題:)通過「有限INTS列表的大小」你的意思是,許多元素,這將是包含所有可能的整數的列表? – MtnViewMark 2010-02-20 16:37:16

+0

@KennyTM,是的,我知道:)尺寸函數是Type Class Finite的一個屬性,對於單獨的子類型(Int,Product of Finites等等)來說是超負荷的,所以'a'用於去除使用哪個超載 – Fry 2010-02-20 17:20:30

回答

11

你需要的值轉換爲整數,可以由fromIntegral函數來完成(Haskell的數字鑄造):

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

它在積分類的任何類型轉換成任何類型的(大)Num類。例如。

fromIntegral (maxBound::Int) - fromIntegral (minBound::Int) 

但是,我不會真的相信你採取的方法 - 它似乎非常脆弱。在承認環繞的類型存在的行爲是相當可疑的。 「有限的int型列表的大小」:

你到底用的意思。這個意義上的大小是多少,如果它不是列表的長度?

+0

是的,它在本質上是列表的長度,但即使是有限的列表可能會很大。因此,爲了獲得列表的長度,我需要先構建列表,然後對其進行交互。這樣我就可以生成答案而不生成整個列表:) – Fry 2010-02-21 17:37:43

4

我相信你正在尋找:

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

將整數轉換成int

+0

...反之亦然。 (即轉換的詮釋爲整數) – BMeph 2010-07-01 23:29:04

0

也許你假設的Haskell,像許多主流語言,如C和(在一定範圍)Java,具有隱式數字強制。它不會:Int和Integer是完全不相關的類型,並且它們之間有一個特殊的轉換函數:fromIntegral。它屬於Num類型類。查看文檔:從本質上講,整合不僅僅是這樣:它是一個通用的「構造任意整數的表示」,t.i.如果您正在實現某種數字並實例化Num,則必須提供一種方法來構建您的類型的整數。例如,在複數的Num實例中,fromIntegral創建一個具有零虛數部分和一個整數實數部分的複數。

Haskell具有隱式數字強制的唯一意義是整數文字被重載,並且當您編寫42時,編譯器將其隱式解釋爲「fromIntegral(42 :: Integer)」,因此您可以在任意位置使用整數需要Num類型的上下文。

+0

對不起,是一個都捨不得虧的(但因爲它觸動了我約的Num類「堆棧」眼中釘之一,我會放縱...),但因爲'複雜了'型(什麼,不是一個班級嗎?那些「過早的優化?)有一個'RealFloat a'上下文,你的fromIntegral'd複數不會有一個完整的實數部分,而是一個「真實」的數字,最有可能是一個Double。 除了那個小小的狡辯之外,這是一個相當不錯的答案 - 繼續! – BMeph 2010-07-01 23:36:27