2011-04-07 107 views
2

我被問在這給我留下了很困惑一類這個問題,我們提出下列要求:什麼類型在Haskell意味着

對於波紋管式聲明:

ranPositions :: Image -> Dims -> [Point] 
getBlockSums :: Image -> Dims -> [Point] -> [BlockSum] 
i :: Image 
d :: Dims 

什麼以下類型? 是不是上面的?!

ranPositions i d 
getBlockSums i d 

所以,我回答是這樣的:

type ranPositions = Array Point Int, (Int, Int) 
type getBlockSums = Array Point Int, (Int, Int) 

// Because (this was given) 

type Image = Array Point Int 
type Dims = (Int, Int) 

除了是錯誤的,這個問題困惑了我,因爲我認爲一個函數的類型是什麼的::後聲明,所以它有已經給了,不是嗎?

我可以做一些解釋,我會很感激任何幫助。

+1

請查看HaskellWiki中的[Currying](http://www.haskell.org/haskellwiki/Currying) – 2011-04-07 13:16:05

回答

8

類型的ranPosition i d[Point] - (鑽營給你返回[Point]功能)

類型的getBlockSums i d[Point] -> [BlockSum] - (鑽營爲您提供了從[Point]返回功能[BlockSum]功能)

3

當然,但他們要求的類型表達式,而不是函數

這難道不是明顯,下面的表達式類型:

foo 
foo a 
foo a b 

都必須是不同的?如果你不清楚,那麼回去看看功能應用。

+0

從技術上講,它們不會有所不同。比較'id','id id','id id id'的類型。但總的來說,是的,它們應該是不同的。 一個很好的例子可能是 (+):: Int - > Int - > Int - 取兩個數字並將它們相加 (1+):: Int - > Int - 取一個數字並將其加1 1 + 2):: Int - 取零數字並返回3 – 2011-04-10 13:03:40

+0

@Tyr - 這很棘手,但有人可能會認爲id :: forall a。 a - > a是多態的,而表達式(id id)不是,它是一個unknmown類型的單形函數。差別可以在相當人造的例子中看到,例如** case id id f - >(f id,f const)**,它不應該檢查,而**(id id,id const)**會。 OTOH,** f - >(f id,f const)**的案例ID不應該鍵入檢查,所以再次證明id和id id是相同的。 – Ingo 2011-04-10 20:40:37

+0

我在GHCi中的輸出是:t,以及它在評估中會減少什麼。 – 2011-04-10 21:04:09