[英]Using data types in Haskell
我已經開始這是一個新問題,因為它成為我上一個問題的后續問題。
如果我有兩個由類似構造函數組成的數據類型:
data A = X | Y | Z
data B = X | Y
是不是我不能以某種方式表示這個:
data A = C | Z
data B = C
data C = X | Y
如果你能看到我在做什么 - 我正在嘗試將X |分組 Y為一種數據類型,然后可由多種其他數據類型使用。 我似乎無法讓編譯器允許這個,或者如果它,我不能模式匹配X或Y,只有C ??
我收到多次聲明C的錯誤消息。
我以為我可以使用類型,但它們不允許多種類型。
編輯
即使我聲明了很長的路(如下所示),它仍然無法編譯,並且說X和Y有多個聲明:
data A = X | Y | Z
data B = X | Y
你不僅不能這樣做,你也不能做你的第一個選擇 - 即你不能在同一模塊中有兩種類型,它們都有名為X
和Y
構造函數。
如果你能做到這一點, X
的類型應該是什么 - C
, A
或B
? 最明顯的答案是C
,但是你不能在需要A
或B
的上下文中使用它(注意Haskell沒有子類型),這樣就會破壞整個構造的目的。
你能做的最好的事情是將C包裝在A和B的構造函數中,即:
data A = AC C | Z
data B = BC C
data C = X | Y
然后,您可以使用AC
或BC
構造函數包裝C,以分別創建類型A
或B
的值。
你不能這樣做的原因
data A = X | Y | Z
data B = X | Y
如下。 假設你稍后寫了一些代碼:
foo n = (n,X)
它構建了一對由第一個槽中的n
和第二個槽中的X
組成的對。 編譯器應該推斷出什么類型? 有效的類型是
foo :: a -> A -> (a,A)
因為X
是A
類型的構造函數,但同樣有效
foo :: a -> B -> (a,B)
因為X
是B
類的構造函數。 如果有兩個具有相同名稱的構造函數,則無法推斷使用它們的函數的唯一類型。 因此,您不允許在同一模塊中為兩個構造函數提供相同的名稱。
你不能這樣做:
data A = C | Z
data B = C
data C = X | Y
(順便說一句,如果B
與 C
相同 ,那么為什么要有B
?)
但你可以做的是這樣的事情:
data A = A_Other C | Z
data B = B_Other C
data C = X | Y
然后你可以像這樣模式匹配:
foo :: A -> String
foo (A_Other X) = "X"
foo (A_Other Y) = "Y"
foo ( Z) = "Z"
bar :: B -> String
bar (B_Other X) = "X"
bar (B_Other Y) = "Y"
foobar :: C -> String
foobar X = "X"
foobar Y = "Y"
如果這是有道理的......
你不能做你想要的,因為你聲明了多個數據構造函數。 在
data A = X | Y | Z
實際上,您正在引入具有3個構造函數(值) X
, Y
和Z
的類型A
這就是為什么你的第一段代碼不能編譯,它會看到同樣的名稱被列為兩種不同類型的構造函數! 如果你能做到這一點,你必須問自己是
X :: A
要么
X :: B
在非面向對象的環境中,這是可怕的! 因此,您需要提供不同的構造函數名稱來共享底層數據C
如果你想要考慮這一點,你可以這樣做,因為其他帖子在每個數據類型的唯一構造函數中都有建議和分解數據
data A = CForA C | Z
data B = CForB C
data C = X | Y
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.