2012-09-18 120 views
0

我目前正在寫我自己的structurewhich可以同時處理整數和字符串:包含列表不同類型

喜歡的東西

data Collection = One Int | Two String | Three(Collection)(Collection)

不過,我試圖寫一個函數可能將我的結構轉換爲列表。

我是正確的思維,這是不可能的,因爲,在默認情況下這樣做的:

[1,2,「測試」]在控制檯

不工作,因此我的功能必然總是失敗?

+0

這個問題給你帶來了一天中的詞彙單詞:[異構](http://www.haskell.org/haskellwiki/Heterogenous_collections)。 – MatrixFrog

回答

4

你或許應該只是界定

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打印在一個不錯的方式列表。

+0

這看起來不錯 - 這意味着我可以識別我的輸入是整數還是字符串? – Lethi

+0

使用無論是表示我只限於兩種不同的類型? – Lethi

+0

我已經編輯它來顯示如何使用兩種以上的類型。我不確定你的意思是「承認」。它不會自動地知道它是一個字符串還是int - 你必須像我最後一個例子那樣使用MyInt或MyString。然而,它會'記住'這個類型,如果你希望它稍後以不同的方式處理類型,這將會很有用。 –

1

Haskell中的列表只能有一種類型。如果你想要一個列表來處理多種類型,你需要創建一個新的包裝類型,它可以表示你想要放入它的兩種類型,以及提取原始類型和處理它的函數。例如,您可以使用Either

3

您的數據結構基本上是一棵二叉樹,它在每個葉片上存儲一個IntString。遍歷這棵樹自然是一個[Either Int String]

相關問題