2017-07-11 17 views
2

我有一個Vehicle類型取決於PowerSource類型:功能上依賴型是不是總,而是伊德里斯認爲這是總

data PowerSource = Petrol | Pedal | Electric 

data Vehicle : PowerSource -> Type where 
    Unicycle : Vehicle Pedal 
    Motorcycle : (fuel: Nat) -> Vehicle Petrol 
    Tram: (battery : Nat) -> Vehicle Electric 

和功能wheelsTram是未處理的情況。

wheels : Vehicle power -> Nat 
wheels Unicycle = 1 
wheels Motorcycle = 2 

當我檢查的wheels從REPL總的煩躁,

:total wheels 
Main.wheels is Total 

,因爲我沒有在wheels處理Tram型,我不明白怎麼wheels可總。我誤解了「總數」是什麼意思?

回答

6

這是因爲在wheels Motorcycle中,它將Motorcycle作爲變量處理,因爲它沒有很好地作爲構造函數應用程序類型化 - Motorcycle構造函數接受一個參數。

事實上,這通過類型檢查是非常令人驚訝的,我認爲這實際上是在伊德里斯設計(可修復)的錯誤。爲了避免這種錯誤,我認爲它應該只允許模式變量自動綁定,如果它們以小寫字母開頭,就像綁定類型變量一樣。

+0

OMG這是一個可怕的功能。這是否也意味着'數據Vehicle:PowerSource - > Type Unicycle:Vehicle Pedal;摩托車:汽油車;電車:車輛電力',像'總車輪:車輛踏板 - >納特;輪子獨輪車= 1;輪子摩托車= 2'會以同樣的方式檢測嗎? – Cactus

+0

在這個例子中,構造函數不接受參數,因此它們將類型檢查作爲應用程序檢查到構造函數,因此'wheels'不會是全部。正如我所說,這是呃意外的特徵,這是另一種說錯的方式。我們應該儘快解決它。 –