2017-05-10 125 views
0

定義的類型我已經定義在球拍以下幾種類型:空調在球拍

(define-type vname (Pairof String Integer)) 

(define-type term (U vname (Listof (Pairof String term)))) 

(define-type subst (Listof (Pairof vname term))) 

我將如何定義與簽名(-> subst term term)過程(lift s t)是在tvname型或(Listof (Pairof String term))的條件?有沒有簡單的方法來測試一個聯合類型的實際類型?如果我改爲(define-type term (U String Integer)),則可以使用string?來測試t是否爲字符串;我如何將這擴展到我的情況?

回答

0

工會不是一個有歧視的工會,所以不會自動有辦法做到這一點。但是,在這種特殊情況下,您可以區分這兩種情況,因爲vname將始終與cdr位置中的Integer配對,而(Listof (Pairof String term))類型的值將爲'(),否則將與一個配對(可能爲空)列表中的cdr位置。

(define (vname? x) 
    (and (pair? x) (exact-integer? (cdr x)))) 
1

我在類型化的球拍碰到類似的問題,我發現它簡單定義結構爲我所有的平凡類型:所以作謂語vname?可以定義。然後你可以使用結構謂詞來區分類型,例如。

(struct vname (name val)) 
(vname? (struct "foo" 5)) 
+0

但是,如何定義'term'使用結構? – Simeon

+0

我不熟悉你的問題。但它看起來像你可以定義一個'(struct foo(str term)',然後'(define-type term(U vname(Listof foo))'你甚至可以定義一個結構來包裝列表本身。 – Gibstick