簡體   English   中英

純腳本中的 SProxy?

[英]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.

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