2017-09-14 66 views
1

我有下面的代碼的一個問題,在SML:SML:如何比較(< or >)2種平等類型

fun inter s1 s2 = 
    let 
    fun inter' [] _ interSet = interSet 
     | inter' _ [] interSet = interSet 
     | inter' (x1::s1) (x2::s2) interSet = 
      if x1=x2 then 
       inter' s1 s2 (x1::interSet) (* Add the value to the intersection and advance in both s1 and s2*) 
      else if x1 < x2 then 
       inter' s1 (x2::s2) interSet (* Keep going through s1 *) 
      else 
       inter' (x1::s1) s2 interSet (* Keep going through s2 *) 
    in 
     if s1=[] orelse s2=[] then [] 
     else       
     inter' s1 s2 [] 
end; 

函數返回一個包含兩個有序列表S1之間的交叉點的列表和s2(即在s1和s2中找到的值)。我期待它人人平等工種,但功能類型是:

val inter = fn: int list -> int list -> int list 

爲什麼不:

val inter = fn: ''a list -> ''a list -> ''a list ? 

它看起來像問題來自

x1 < x2 

我是否錯誤地認爲<運算符對於所有相等類型都是重載的?它不應該比較字符串嗎?

+1

請不要忘記標記答案,如果他們幫助你接受。另外,upvote他們。 –

回答

3

是的,你錯了相信。如果相等類型支持排序,他們可能會被稱爲有序類型。 ;)

您需要做的是將您的比較運算符作爲參數傳遞給inter函數。或者,如果這是更大模塊的一部分,則可以考慮將其作爲仿函數。在這兩種情況下,我都會建議通過一個不那麼簡單的操作符,而是爲每個內置類型(例如Int.compare)預定義一個3路函數compare : 'a * 'a -> order

+0

謝謝你的回答!這一切都有道理:)。 – Paikan