2011-11-07 77 views
2

我有一個數據類型,例如:Haskell的抽象數據類型和檢索字符/定義爲字符串

data MyData = Something1 String 

,然後我myFunction的內有功能

myFunction :: MyData -> String 
myFunction x = x 

我想指的是字符,即['S','o','m','e'......'1']這些都是我的數據類型MyData。不過,我得到以下錯誤:

Couldn't match expected type [Char]' with actual type MyData' Expected type: String Actual type: MyData

據我瞭解[字符]相同字符串,我宣佈「Something1」爲字符串,所以它應該工作?

回答

2

[Char]String相同,但都不是MyData。訪問存儲數據類型中的字符串,你需要使用模式匹配:

myFunction :: MyData -> String 
myFunction (Something1 xs) = xs 

這是因爲data關鍵字使得一個完全新的數據類型。如果你只想要一個別名,你也可以使用關鍵字type

type MyData = String 

myFunction :: MyData -> String 
myFunction x = x 
+0

我應該告訴你我的整體問題,我想創建自定義數據類型,但是我需要能夠在我的代碼中訪問組成它們的角色(如Something1)。 – user997112

+0

啊,我想我明白你想要做什麼。不,你不能直接訪問構造函數本身的名字,儘管你可以定義一個函數'myFunction(Something1 _)=「Something1」'。更高級的選項是派生'Data'和'Typeable'類類。這將允許你編寫'myFunction x = showConstr(toConstr x)',但是它是同樣的事情,編譯器爲你創建樣板。 – hammar

2

邁德特是一樣的字符串。它只是非常相似。

可以聲明一個類型同義詞是這樣的:

type MyData = String 

然後邁德特和字符串兩個名字相同的類型。實際上,String已經是[Char]的一個類型的同義詞。在這種情況下,myFunction只是標識功能id

或者你也可以使用模式匹配提取從MyData的像這樣的字符串:

myFunction :: MyData -> String 
myFunction (Something1 xs) = xs 

或者,您可以使用記錄語法,使自動存取:

data MyData = Something1 { myFunction :: String} 

(此實際上與上述聲明myFunction相同,除了現在可以使用語法Something1 { myFunction = x }以及Something1 x構造MyData

+0

嗨,最大,如果我要使用類型MyData = String,然後我可以聲明哪些抽象類型可以使用構造函數的MyData的一部分?我想聲明MyData只允許說Object1 | Object2 | Object3,然後能夠訪問這些Objectx的,來檢索他們的角色? – user997112

+0

否。如果您使用類型MyData = String,則MyData和String完全相同。我不確定你的意思是「檢索Objectx的人物」。 – Max