[英]SProxy in purescript?
純腳本中的Sproxy有什么用?
在追求中,它被寫成
data SProxy (sym :: Symbol)
--| A value-level proxy for a type-level symbol.
純符號中的符號是什么意思?
首先,請注意 PureScript 從 0.14 版開始現在有 polykinds,並且大多數函數現在使用Proxy
而不是SProxy
。 Proxy
基本上是SProxy
的泛化。
PureScript 知道值級別的字符串(稱為String
)和類型級別的字符串(稱為Symbol
)。
String
在運行時可以有任何字符串值。 編譯器不跟蹤字符串的值。Symbol
不同,它只能有一個值(但請記住,它是在類型級別上的)。 編譯器會跟蹤這個字符串。 這允許編譯器對某些表達式進行類型檢查。符號最突出的用途是在記錄中。 Record 和 String-Map 之間的區別在於編譯器在編譯時知道鍵並且可以進行類型檢查查找。
現在,有時我們需要彌合這兩個世界之間的差距:類型層面和價值層面的世界。 也許你知道 PureScript 記錄在官方編譯器中實現為 JavaScript 對象。 這意味着我們需要以某種方式從我們的符號接收字符串值。 神奇的 function reflectSymbol
允許我們將符號轉換為字符串。 但是符號是在類型級別上的。 這意味着我們只能在可以編寫類型的地方編寫符號(例如在::
之后的類型定義中)。 這就是 Proxy hack 的用武之地SProxy
是一個簡單的值,通過應用它來“存儲”類型。
例如,從purescript-records
get
function 允許我們從記錄中獲取屬性的值。
get :: forall proxy r r' l a. IsSymbol l => Cons l a r' r => proxy l -> Record r -> a
如果我們應用第一個參數,我們會得到:
get (Proxy :: Proxy "x") :: forall r a. { x :: a | r } -> a
現在你可以爭辯說你可以通過簡單地編寫得到相同的 function:
_.x :: forall r a. { x :: a | r } -> a
它具有完全相同的類型。 這導致了最后一個問題:
嗯,有一些元編程場景,你不是為特定的符號編程,而是為任何符號編程。 想象一下,您想為任何記錄編寫 JSON 序列化器。 您可能希望“迭代”記錄的每個屬性, get
值,將值本身轉換為 JSON,然后將鍵值對與所有其他鍵和值結合起來。
可以在此處找到此類實現的示例
這可能不是最技術性的解釋,但這就是我的理解。 希望能幫助到你!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.