簡體   English   中英

使用Ada子類型等功能語言定義自然數

[英]Define natural numbers in functional languages like Ada subtypes

在Ada中定義自然數,您可以這樣寫:

subtype Natural  is Integer range 0 .. Integer'Last;

這是類型安全的,並在編譯時檢查。 它簡單(一行代碼)且效率高(它不像許多功能語言那樣使用遞歸來定義自然數)。 有沒有可以提供類似功能的功能語言?

謝謝

這是類型安全的,並在編譯時檢查。

正如您在問題注釋中已經指出的那樣,在編譯時不會對其進行檢查。 Modula-2或任何其他可用於生產的通用編程語言都沒有等效功能。

在編譯時檢查此類約束的能力需要某種依賴類型,細化類型或類似構造。 您可以在定理證明者(如CoqAgda)或實驗/學術語言(如ATSLiquid Haskell)中找到這類功能。

現在,我提到了Coq和Agda這些語言,它們遞歸地定義了它們的Nat類型,所以這不是您想要的,並且ATS是命令式語言。 這樣就留下了Liquid Haskell(當然還有其他我沒有提到的語言)。 Liquid Haskell是具有額外類型注釋的Haskell,因此它絕對是一種功能語言。 在Liquid Haskell中,您可以定義一個MyNat類型(標准庫中已經定義了一個名為Nat的類型),如下所示:

{-@ type MyNat = {n:Integer | n >= 0} @-}

然后像這樣使用它:

{-@ fac :: MyNat -> MyNat @-}
fac :: Integer -> Integer
fac 0 = 1
fac n = n * fac (n-1)

如果然后嘗試使用負數作為參數調用fac ,則會收到編譯錯誤。 如果您以用戶輸入作為參數調用它,也將出現編譯錯誤,除非您專門檢查輸入是否為非負數。 如果刪除fac 0 = 1行,也會導致編譯錯誤,因為現在下一行的n可能為0,因此在調用fac (n-1)n-1負,因此編譯器將拒絕該錯誤。

應該指出的是,即使使用最新的類型推斷技術,像這樣的語言中的非平凡程序最終也將具有非常復雜的類型簽名,並且您將花費大量的時間和精力通過越來越多的類型來追逐類型錯誤類型簽名的復雜叢林,只有難以理解的類型錯誤才能指導您。 因此,這些功能可以為您提供安全的價格。 還應該指出,在使用圖靈完整的語言的情況下,您有時必須編寫運行時檢查,以了解無法發生的情況,因為即使您認為應該編譯器也無法證明所有內容。

類型化的球拍,一個類型的話球拍 ,有着豐富的數字亞型,它知道了相當多的封閉性(例如,兩個非負數的和非負,雙精確整數的和是一個准確的整數,等)。 這是一個簡單的例子:

#lang typed/racket
(: f : (Nonnegative-Integer Nonnegative-Integer -> Positive-Integer))
(define (f x y)
  (+ x y 1))

類型檢查是靜態完成的,但是類型檢查器當然不能證明有關數字子類型的所有真實事實。 例如,以下函數實際上僅返回類型為Nonnegative-Integer值,但是減法的類型規則僅允許TR得出Integer的結果類型。

> (lambda: ([x : Nonnegative-Integer] [y : Nonnegative-Integer])
    (- x (- x y)))
- : (Nonnegative-Integer Nonnegative-Integer -> Integer)
#<procedure>

St-Amour等人(在PADL 2012中出現)在“ 鍵入數字塔”中描述了數字的類型化拍子方法。 有通常的文件的鏈接在這里 ,但鏈接似乎在瞬間被打破。 如果您搜索標題,Google會將PDF緩存為HTML。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM