2016-09-07 178 views
3

對於( - >),我們有:數據( - >)a b是什麼意思?

Prelude> :i (->) 
data (->) t1 t2   -- Defined in ‘GHC.Prim’ 

是什麼語法是什麼意思?我認爲數據聲明關鍵字需要LHS上的類型構造函數和RHS上的一個或多個值構造函數?

(( - >)通常如何說出或發音?

+1

'(+)a b'等價於表達式層面的'a + b'。 '( - >)a b'等同於類型級別的'a - > b''。用括號括起中綴表達式就是你如何在前綴中編寫它。 –

回答

11

(->)是函數類型,人們通常將其聲明爲「to」(即a -> b將被讀作「a to b」)。

(->)是構建在GHC中的一種基本構造:編譯器專門處理它。然而,有的像:i工具,與正常的工作類型看(->)假的定義,如果它是一個空的數據類型:

data (->) a b 

這使得:i來向您提供有關內置操作,如果它是一個正常的定義。

(->) a b語法是綴名的前綴版本,就像你可以在前綴的形式定義正常運營:

a ~+ b = a * b + b 

相同

(~+) a b = a * b + b 

如果你真的試圖定義(->)這樣你自己,你會得到一個錯誤:

<interactive>:20:1-13: error: 
    Illegal binding of built-in syntax: (->) 

但是,您可以定義空的數據類型,這樣的自己,如果你給他們一個有效的名稱:

data Foo a b 

這使得Foo有兩個(幻影)的論點有除⊥沒有價值,就像Void類型從Data.Void

如果你要玩的綴語法,您可以定義一個類型的操作與TypeOperators擴展啓用,具有相同的含義Foo

data a +~ b 

data (+~) a b 

這例如,如果我們想模擬OCaml並將其寫入a * b而不是(a, b)

type a * b = (a, b)