簡體   English   中英

F#代碼報價和通用功能

[英]F# Code Quotations and generic functions

如果您嘗試在<@@@@>符號之間附加泛型函數,請說

<@@ let f x = x in f 1 @@>

您收到以下編譯錯誤:

引號表達式中不允許使用內部泛型函數。 考慮添加一些類型約束,直到此函數不再通用。

這是一個實現限制(尚未實現的缺失功能)還是概念問題(或兩者兼而有之)?

編輯:只是為了澄清,即使使用符號<@@>鍵入引號也會出現相同的錯誤。

編輯2:可以,但是,注釋的通用功能與ReflectedDefinitionAttribute其AST應該可以通過反射。

通用定義需要對API進行大量更改。 例如, Quotation.Var類型有三個字段:名稱,類型(由System.Type值表示)和可變性標志。 但是如果你有泛型定義,那么你需要擴展變量的Type屬性以允許類型參數 ,而不僅僅是具體的.NET類型。 但是代表這些有點棘手 - 你如何確保平等正常工作(例如, let z = let x (a:'a) = a in let y (a:'a) = a in x, y the the two 'a s為獨立的,不應該被視為相等,並且推斷的簽名是z: ('a->'a)*('b->'b)

它變得更糟。 如果泛型類型是定義的內部類型(如示例所示),那么至少表達式的整體類型仍然可以在現有的F#類型系統中表示(例如,作為Quotation.Expr<int> )。 但如果類型變量可以“逃避”,那么我們就會遇到一些棘手的問題。 例如, <@ fun x -> x @>的類型是什么? 我們希望它類似於Quotations.Expr<forall 'a.'a> ,但當然這不是F#中的有效類型。

這並不是說解決這些問題是不可能的 ,但它需要大量的設計,實現和測試工作,以及對類型系統的非平凡的改變。

暫無
暫無

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

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