對this後續問題,假設我有兩個t1和t2的某個代數數據類型的術語,並且檢查到t1和t2的構造函數是相同的。也就是說,(非正式),T1 = F(S)和t2 = G(T),我已經檢查了F = G。現在,我想計算收集某種類型的構造函數的參數
map f (zip S T)
假設S和T是名單參數。這個天真的代碼會要求S中的所有東西都是單一類型的,但一般情況並非如此。
在這一點上,我只是好奇,如果有辦法做到這一點。看起來像構造函數的套件將是一個更簡單的解決方案。我想寫一個泛型類型,但我只需要它的某種特定類型。
編輯:我對這個問題的描述不太對。我使用的類型是一樣的東西
data Term v = F (Term v) (Term v)
| G (Term v)
| C
| Var v
對於Term v
類型的零個或多個參數(如(F x y, F z w)
),我想申請到他們每個人的功能,並收集結果的列表構造函數:[f (x,z), f (y,w)]
,我想忽略這些變量。
我假設Term v
類型是Unifiable v
,它有一個方法isVar
,它挑選出我的類型中的哪些項是變量。但是鑑於類型可以具有任意參數的構造函數,所以我不確定我首先可以得到什麼概括性。我需要類似於那裏有一個特定的Var
構造函數,以及所有其他構造函數的形式爲F [Term v]
,或者這樣的,我不知道我需要保證什麼約束。
編輯:更具體地說,我試圖定義一個函數(在假哈斯克爾)
match :: (Variable v) => Term v -> Term v -> Maybe [(v, Term v)]
match t1 t2 = case t1 of
Var v -> Just (check v t2)
f xs -> case t2 of
Var v -> Just (check t1 v)
g ys -> if f == g then flatten(map match (zip (xs,ys)))
else Nothing
當然,你不能使用的情況下那樣,這種假設每個構造(除了Var)以一個列表作爲它的參數。
呃。由於'S'和'T'中有不同類型的術語,因此您將需要(或至少需要)不同的'f's。你如何描繪出「f」的選擇? –
你能用一個更具體的例子來說明你想做什麼嗎?我不確定你的意思是「假設S和T是參數列表」*。 – 4castle
其實在我想要的情況下,這些列表實際上將是單一類型。我正在編輯示例 –