我一直在試驗伊德里斯,它似乎應該很簡單,指定某種類型來表示兩個不同數字之間的所有數字,例如, NumRange 5 10
是5到10之間的所有數字的類型。我想包含雙打/浮點數,但是對於用整數相同的類型也同樣有用。我會如何去做這件事?如何指定一個數字範圍作爲Idris中的一個類型?
9
A
回答
7
實際上,您可能會做得更好,只需根據需要檢查邊界,但您當然可以編寫數據類型來強制執行此類屬性。
一種簡單的方法來做到這一點是這樣的:
data Range : Ord a => a -> a -> Type where
MkRange : Ord a => (x,y,z : a) -> (x >= y && (x <= z) = True) -> Range y z
我一般寫它在Ord
類型類,雖然你可能需要專門它。範圍要求以等式表示,所以在構建它時只需提供一個Refl
,然後將檢查該屬性。例如:MkRange 3 0 10 Refl : Range 0 10
。像這樣的一個缺點是不得不提取包含的值。當然,如果你想以編程的方式構造一個實例,你需要提供證明界限確實滿足的證明,或者在允許失敗的情況下執行,如Maybe
。
我們可以爲Nat
s寫一個更優雅的例子,因爲對於他們我們已經有了一個庫數據類型來表示比較證明。特別是LTE
,表示小於或等於。
data InRange : Nat -> Nat -> Type where
IsInRange : (x : Nat) -> LTE n x -> LTE x m -> InRange n m
現在這個數據類型很好地封裝了n≤x≤m的證明。對於許多臨時應用程序來說這將是過分的,但它肯定會顯示如何使用依賴類型來達到此目的。
相關問題
- 1. 爲MySQL字段指定一個數字範圍
- 2. 如何爲C#中的if語句指定一個數字範圍?
- 3. 如何在numpy.piecewise中指定一個範圍(每個範圍2個條件)
- 4. 如何在Excel中爲宏指定一個動態範圍
- 5. 在數據驗證代碼中指定一個範圍作爲字符串
- 6. 如何從其他單元格中的數字指定一個數組範圍
- 7. 的Python:如何規定一個範圍,以一個類變量
- 8. 一個指令範圍屬性綁定到一個字符串
- 9. 定義一個變量作爲範圍
- 10. 如何使用Arduino將數字從一個數字範圍轉換爲另一個數字範圍
- 11. Haskell:定義一個函數範圍的新數據類型
- 12. 如何指定一個數組元素的範圍
- 13. 如何指定一個Unicode字符範圍
- 14. 如何在一個函數類型中允許不同的子範圍類型
- 15. 從另一個範圍的值中定義一個範圍
- 16. 翻譯從一個數字範圍到另一個範圍
- 17. 指定一個數字範圍在PHP的imap_mail_move功能
- 18. 如何在Excel中指定一個值的範圍?
- 19. 查找一個工作表中的值在指定範圍內的另一個
- 20. 如何設置一個數字範圍爲這個功能
- 21. 指定一個範圍,在PHP
- 22. 如何在PHP中生成一個唯一的數字範圍
- 23. 定位範圍內的一個範圍
- 24. 在C++中指定一個ASCII小寫字母的範圍
- 25. 如何在一個類的範圍內定義一個函數,但不能作爲成員函數
- 26. 給變量類型一個範圍CGFloat
- 27. 指定日期範圍子集與一個數字月(?錯誤)
- 28. 如何在c中爲一個條件編寫一個數字範圍
- 29. 確定一個數字是否落入指定的一組範圍內
- 30. 如何在我的spring bean配置中指定一個數字範圍作爲值?
請看這裏:http://hackage.haskell.org/package/type-natural-0.2.1.1/docs/Data-Type-Ordinal.html。 'Ordinal 5'包含0到4的所有自然數。 – 2015-02-10 10:26:13
您可以將'NumRange 5 10'表示爲'Fin 6','fZ'代表5,'fS fZ'代表6,依此類推。 – Cactus 2015-02-11 01:45:08