2016-06-14 64 views
1

假設我有以下值構造:爲什麼在值構造函數中聲明的類型在Haskell中不是類型?

data Shape = Circle Float Float Float | Rectangle Float Float Float Float 

現在我可以運行:

ghci> :t Circle 
Circle :: Float -> Float -> Float -> Shape 

現在我可以寫一個類型聲明

surface :: Shape -> Float 

但我不能鍵入型號聲明

surface :: Circle -> Float 

is becauseCircle是不是一個類型,Shape是」

我的問題是:爲什麼在Haskell聲明中值構造不種類型?

+8

「的價值構造函數聲明的類型」。它們不是類型,所以它們絕對不是「在值構造函數中聲明的類型」。他們是數據構造函數。你也不能編寫函數'surface :: 13 - > 1.2'。 – pdexter

+3

'data'的語法是歷史事故。使用GADT語法以更一致的方式爲構造函數提供類型。 – augustss

+0

@augustss ...這不是一個真正的意外 - 我認爲GADT甚至還沒有達到標準(不是太重要) – Carsten

回答

8
data Shape = Circle Float Float Float | Rectangle Float Float Float Float 

Shape是一種類型(和類型構造函數)。 Float是另一種類型。

CircleRectangle是類型爲Shape的值構造函數。

我想你的困惑來自OOP分類 - 注意Haskell與此沒有類似之處。以上未聲明CircleRectangle兩種類型爲Shape的子類型。

使用像GADTs一些高級擴展你其實可以寫類似foo :: Circle -> Float這意味着一個參數是已建成爲一個CircleShape。這需要一些類型級別的技巧。

另外,一個普通的Haskell的做法可能是沒有意義

data Circle = Circle Float Float Float 
data Rectangle = Rectangle Float Float Float Float 
data Shape = Scircle Circle | Srectangle Rectangle 
相關問題