我有一個資料型別定義如下:
data MyType a = MyType Weight [a]
和重量是 type Weight = Integer.
我不完全明白這里發生了什么。是MyType由一個整數或[a],或兩者組成?
在我的情況下,我已經得到了MyType (a,b),我想知道,這是一個串列(a,b),如果是,我需要使用什么語法來提取串列a?
uj5u.com熱心網友回復:
MyType是一個由Intand組成的型別[a],所以它兩者都有。要從型別中提取串列,您可以使用模式匹配:
getList :: MyType a -> [a]
getList (MyType _ a) = a
或者,您可以使用記錄語法宣告型別:
data MyType a = MyType { getWeight :: Weight, getList :: [a] }
它會自動生成解包函式,以便 getList (MyType 2 [3,4]) == [3,4])
uj5u.com熱心網友回復:
正如你所說,
data MyType a = MkMyType Weight [a]
-------- -------- ------ ---
-- type data type of type of
-- constructor 1st field 2nd field
定義資料型別。請注意,我做了一個小改動,寫MkMyType在 的右側以將=其MyType與左側的區別開來。
現在,對于任何特定的a,MyType a是一種資料 型別——它是一種可以出現在定義右側的東西。
MkMyType雖然(型別Weight -> [a] -> MyType a)是一個資料建構式。應用于Weight-type 值和[a]-type 值,它創建一個type值MyType a,它確實同時保留兩個值——一個Weight-type 值和一個[a]-type 值,它們在它的創建時間。
該值如何在計算機記憶體中表示并不重要。重要的是我們可以對其進行模式匹配,例如
foo :: MyType a -> (Weigth, [a])
foo (MkMyType w as) = (w, as)
--------------------
-- pattern 1st 2nd
-- field field
請注意,在 value 中,MkMyType w as我們有wtype的值Weight(我們寫:)w :: Weight,我們也有astype [a]—— 與a整體型別中出現的相同。
因此我們也可以定義
bar :: MyType (a,b) -> (Weigth, [(b,a)])
bar (MkMyType w abs) = (w, [(b,a) | (a,b) <- abs])
同樣,這里我們有,abs :: [(a,b)]因為引數值的型別是MyType (a,b)- 具有相同的a和b。
所以如果你只想從 中獲取as的串列abs,你可以寫
baz :: MyType (a,b) -> [a]
baz (MkMyType _ abs) = takeFirsts abs
在這里你需要實施
takeFirsts :: [(a,b)] -> [a]
takeFirsts abs = ...
我留給你完成,作為練習。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/389045.html
