![](/img/trans.png)
[英]Why does Haskell force data constructor's first letter to be upper case?
[英]Why I am forced to write the (Data Constructor) name with first letter in small case?
為什么我被迫寫liOfLi
代替LiOfLi
? 請指導。
baby.hs中的代碼
LiOfLi = [[1,3,4,5,6,8],[12,13,15,16,19,20],[23,24,25,45,56]]
ghci回復:
ghci>:寶貝
[1/1]編譯Main(baby.hs,解釋)
失敗,模塊加載:無。ghci> baby.hs:29:1:不在范圍內:數據構造函數`LiOfLi'
將首字母更改為較小的情況時
baby.hs中的代碼
liOfLi = [[1,3,4,5,6,8],[12,13,15,16,19,20],[23,24,25,45,56]]
ghci回復:
ghci>:寶貝
[1/1]編譯Main(baby.hs,解釋)
好的,模塊加載:主要。
以下是我提到的SO問題,但我沒有理解規則/邏輯,並得到(我)上述問題的答案。
變量名稱必須小寫。 與此相關的官方文檔位於haskell.org/onlinereport/intro.html#namespaces - (SO評論) Chris Kuklewicz
數據構造函數(類型構造函數)也必須以大寫字母開頭。 在你實際編譯的第二個例子中, liOfLi
不是數據構造函數,它是一個變量(以小寫字母開頭)。
這個:
liOfLi = [ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]
聲明變量liOfLi
等於[ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]
。
另一方面,這個:
LiOfLi = [ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]
是模式LiOfLi
與[ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]
的模式匹配[ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]
。 作為模式匹配它是相當無用的,因為它不包含任何變量,所以即使它工作也不會做任何事情。 它無法編譯LiOfLi
因為模式正在查找與應用於0參數的構造函數LiOfLi
匹配的所有表達式; 因為構造函數LiOfLi
沒有定義,所以程序無法編譯。
使LiOfLi
成為0參數構造函數的唯一方法是引入一個新類型,如下所示:
data MyNewType = LiOfLi
但LiOfLi = [ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]
仍然不起作用,因為它試圖匹配模式LiOfLi
,它是MyNewType
類型的值的模式, MyNewType
值[ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]
,這是列表類型的值。
基本上,這個等式意味着兩個不同的事情取決於=
左邊的術語是被解釋為模式還是變量。 Haskell的設計者選擇讓它(對於人類讀者和編譯器)總是容易告訴給定的標識符是構造函數還是變量的第一個字母的情況,這反過來允許你判斷一個方程是否是一個模式綁定或變量定義。
當你寫作
liOfLi = [ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]
您定義變量 liOfLi
以產生列表列表給出的值。 相反, 數據構造函數用於定義代數數據類型,例如,您可以定義以下數據類型:
data Tree a = Nil | Node a (Tree a) (Tree a)
這里, Nil
和Node
都是Tree a
類型的數據構造函數。 您可以在ghci中查看它們的類型,它們將顯示:
Node :: a -> Tree a -> Tree a -> Tree a
Nil :: Tree a
Haskell中的“數據構造函數”連接到自定義類型。 它為數據提供了特定的上下文,實際上並不是數據。 類型和數據構造函數必須是大寫的。
小寫表示函數或變量的名稱。 在示例中使用該小寫名稱時,可以將其替換為右側的列表。
在這種情況下,數據構造函數是[]
(實際上是其他東西的簡寫)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.