2011-07-07 136 views
2

想辦法從2小時減去5分鐘。類型參數化算術?

從2中減去5是沒有意義的,因爲我們以-3個通用時間單位結束,這是無用的。但如果「小時」是「分鐘」的子類型,我們可以將2小時轉換爲120分鐘,併產生115分鐘或1小時55分鐘。同樣,如果我們想爲5個桔子添加5個蘋果,我們無法用蘋果來評估這個,但可能預計最終會有10個果實。

看來在上面的例子中,通常當使用數字作爲形容詞時,整數需要通過他們描述的對象的類型來參數化。我認爲這將是非常有用的,如果不是的聲明

val hours = 2 
val minutes = 5 

你可以做類似

val hours = 2[Hour] 
val minutes = 5[Minute] 
val result = hours - minutes 
assert (result == 115[Minute]) 

是否像這樣的東西存在,這將是有用的,是什麼事情,可以實現?

編輯:爲了澄清,上面的時間示例只是我想的一個隨機示例。我的問題是,一般來說參數化Numerics的想法是一個有用的概念,就像你有參數化列表等等(答案可能是「不」,我不知道!)

+0

它可以和已經用很多語言完成。但沒有關於斯卡拉的線索:) – jalf

+4

答案建議你使用像'3.minutes'這樣的結構,它可能會返回某個時間類型的實例。如果你想朝這個方向前進,你可能會想看看「斯卡拉喬達時間」庫,這是一個圍繞Joda Time for Java的Scala包裝器。但是你的例子看起來更像是你想要一個類型類型,比如:'特性TimeValue [TimeUnit]',其中'TimeUnit'是一個_phantom類型_。這看起來非常有趣,因爲它也可能適用於其他單位的措施。我想知道是否可以做到。 – Madoc

+3

這通常稱爲_units_或_measures_。再看看適當的術語 - 有一些圖書館和很多事先的討論。 –

回答

6

你可以有幾個小時,分兩班做到這一點,從小時到分鐘的隱式轉換功能

​​

這允許你這樣做

val h = Hour(2) - Minute(30) //returns Minute(90) 
+0

正確的答案是「查閱'度量單位'」,但接受這一點是因爲它很有用,並且受到大衆需求 –

3

你可以找到一些例子爲此在升降機框架(spec)。

import net.liftweb.utils.TimeHelpers._ 
3.minutes == 6 * 30.seconds 

(注意:看來你需要有合理的數字爲正確的比較,例如可能沒有超過60秒。)

1

在我看來,一個DSL將利用這裏。所以,你可以寫

2.hours - 5.minutes 

及相應的轉換將於2小時轉換成時間對象(值2)等

大量資源的存在說明Scala的DSL能力。例如see this from O'Reilly

+2

您需要編寫'2.hours'或'(2小時)'否則編譯器認爲'-'是一個參數而不是方法。 – Debilski

+0

啊。注意到並修改。 Thx –

2

沿着你可能會嘗試scala-time,這是一個圍繞Joda Time的包裝,使其對Scala更加習慣,包括一些DSL可以進行時間段計算,類似於Brian Agnew在他的建議中回答。

例如,

2.hours + 45.minutes + 10.seconds 

創建喬達Period