2016-11-06 174 views
2

我在讀this guide to types in F#。它說:爲什麼不能在F#中的函數中聲明類型?

類型不能在函數內部聲明。

並給出了一些示例代碼:

let f x = 
    type A = int * int //unexpected keyword "type" 
    x * x 

看來,如果類型只用於功能(即不返回),那麼應該不會有問題。

是否有這樣的理由?

+7

我想它更多,你爲什麼要這樣做? –

+2

借用@JohnPalmer說。我很難提出一個*實用*的場景(注意限定符),這將是有用的。這在實踐中對你來說有問題嗎? – rmunn

+2

當然有一個原因。實現功能需要花費。這個功能幾乎毫無價值。爲什麼你會浪費時間來實現這個功能,而不是在有價值的東西上使用它?你有定義一個函數範圍類型會有用的場景嗎? – Luaan

回答

3

嵌套函數內部類型的原因往往超出了F#類型系統的能力或代碼風格問題的指示器。

問題的案例:簡單抽象

讓我們在這個問題,這裏的類型只是一些普通的抽象或速記的情況下開始。在F#中似乎沒有這個功能的需求 - 這並不令人感到意外。對於嵌套這種類型到一個函數是一個好主意,下列要求必須滿足:

  • 在函數內部傳來傳去的值混淆足以需要自己的類型。

  • 這種類型不是其他地方有用的,不應該暴露

  • 雜波這種類型會導致,即使在封閉的命名空間或模塊專用型,比混合型更大的問題定義到函數中。

對於這個話題是相關,它會變得怪異:

  • 此類問題的發生如此頻繁,即使是像內部額外的模塊變通辦法不是沒有顯着的開銷,解決它。

呃......這聽起來像是在問題出現之前,關注點分離了。如果有一種情況下可以創建這種類型的代碼,我現在無法弄清楚。好的代碼通常是從小的,可重用的抽象中構建的。上述聽起來像什麼,但那。

的未來派的案例:一流的類型

有一個更有趣的方面對這個問題,我希望會回來給我們的未來。也許我們想在函數內聲明一個類型,因爲它的定義取決於函數的輸入!如果函數會像處理其他參數一樣對待類型參數,並讓它們對它們進行操作?

這樣的功能將是泛型和類型提供者的超集。我想它可能是一個非常優雅和非常強大的功能。但是我不知道任何一種語言都可以這樣做,並且具有IDE支持的類型安全性,可以與F#競爭。

所以,答案就是:類型不是F#中的第一類值。你需要一個非常不同的語言,而這種語言似乎還不存在。

+1

相關:https://en.wikipedia.org/wiki/Dependent_type – sdgfsdh

+1

@sdgfsdh有一種[F *語言](https://www.fstar-lang.org/),它與F#類似,類型。雖然我認爲這與一流的類型基本上是正交的。相關類型涉及在類型中表達附加約束的能力。第一類類型會關注以更靈活的方式創建類型的能力,與C++模板,代碼生成器,類型提供程序等功能競爭。 – Vandroiy

相關問題