2015-01-14 162 views
2

我正在學習Haskell,我很困惑this example類型類中的類型值構造函數

考慮以下幾點:

class Tofu t where 
    tofu :: j a -> t a j 

data Frank a b = Frank {frankField :: b a} deriving (Show) 

instance Tofu Frank where 
    tofu x = Frank x 

爲什麼是它使FrankTofu實例時,我們提供(據我所知),類型構造Frank x,而不是一個值構造,即tofu x = Frank {frankField = x}

回答

6

您仍在使用值構造函數。您可以使用具有記錄字段的類型,而無需使用記錄語法來構造它們,因此Frank x的功能與Frank { frankField = x }的功能相同。

如果你有一個以上的記錄字段,如:

data Frank a b = Frank { frankA :: a, frankB :: b } 

...那麼字段出現在你已經書面他們,所以你可以做的順序:

-- With x :: a, y :: b 
Frank x y 
+1

啊!我想我對這樣的事實感到困惑:類型和值構造函數都被命名爲「弗蘭克」......謝謝! – d125q

+3

是的,起初可能有點混亂。只要記住,如果你在類型簽名/類聲明/ etc中看到一個CapitalizedIdentifier,它將是一個類型名稱,而在其他地方它將成爲一個構造函數。 – porges

+1

@ d125q更具體地說,類型名稱與值構造函數名稱和函數/值名稱不共享相同的名稱空間。 – bheklilr

相關問題