我目前正在寫我自己的structurewhich可以同時處理整數和字符串:包含列表不同類型
喜歡的東西
data Collection = One Int | Two String | Three(Collection)(Collection)
不過,我試圖寫一個函數可能將我的結構轉換爲列表。
我是正確的思維,這是不可能的,因爲,在默認情況下這樣做的:
[1,2,「測試」]在控制檯
不工作,因此我的功能必然總是失敗?
我目前正在寫我自己的structurewhich可以同時處理整數和字符串:包含列表不同類型
喜歡的東西
data Collection = One Int | Two String | Three(Collection)(Collection)
不過,我試圖寫一個函數可能將我的結構轉換爲列表。
我是正確的思維,這是不可能的,因爲,在默認情況下這樣做的:
[1,2,「測試」]在控制檯
不工作,因此我的功能必然總是失敗?
你或許應該只是界定
type Collection = [Either Int String]
然後,而不是做
l = [1,2,"test"]
你可以做
l :: Collection
l = [Left 1, Left 2, Right "test"]
如果你想超過兩種類型,你需要定義您自己的成員類型。所以,你會做這樣的事情藏漢
data MemberType = MyInt Int | MyString String | MyFloat Float deriving Show
type Collection = [MemberType]
l :: Collection
l = [MyInt 1, MyInt 2, MyString "test", MyFloat 2.2]
的deriving Show
是沒有必要的,但它很高興能夠爲根本print l
打印在一個不錯的方式列表。
Haskell中的列表只能有一種類型。如果你想要一個列表來處理多種類型,你需要創建一個新的包裝類型,它可以表示你想要放入它的兩種類型,以及提取原始類型和處理它的函數。例如,您可以使用Either
。
您的數據結構基本上是一棵二叉樹,它在每個葉片上存儲一個Int
或String
。遍歷這棵樹自然是一個[Either Int String]
。
這個問題給你帶來了一天中的詞彙單詞:[異構](http://www.haskell.org/haskellwiki/Heterogenous_collections)。 – MatrixFrog