纯脚本中的 SProxy?

SProxy in purescript?

纯脚本中Sproxy有什么用?

在Pursuit中,写成

data SProxy (sym :: Symbol)
--| A value-level proxy for a type-level symbol.

purescipt 中的 Symbol 是什么意思?

首先,请注意 PureScript 从 0.14 版本开始就有了多类型,并且大多数函数现在使用 Proxy 而不是 SProxyProxy 基本上是 SProxy.

的概括

关于符号和字符串

PureScript 知道值级别字符串(称为 String)和类型级别字符串(称为 Symbol)。

  • A String 在运行时可以有任何字符串值。编译器不跟踪字符串的值。
  • A Symbol 不同,它只能有一个值(但记住,它是类型级别的)。编译器会跟踪这个字符串。这允许编译器对某些表达式进行类型检查。

实践中的符号

符号最突出的用途是记录。 Record 和 String-Map 之间的区别在于编译器在编译时知道键并且可以对查找进行类型检查。

现在,有时我们需要弥合这两个世界之间的鸿沟:类型层面和价值层面世界。也许您知道 PureScript 记录在官方编译器中作为 JavaScript 对象实现。这意味着我们需要以某种方式从我们的符号中接收一个字符串值。神奇的函数 reflectSymbol 可以让我们把一个符号变成一个字符串。但是符号是在类型级别上。这意味着我们只能在可以写类型的地方写一个符号(例如在 :: 之后的类型定义中)。这就是 Proxy hack 的用武之地。SProxy 是一个简单的值,通过应用它来“存储”类型。

例如 purescript-records 中的 get 函数允许我们从记录中获取 属性 处的值。

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

现在你可以争辩说你可以通过简单地写来获得相同的功能:

_.x :: forall r a. { x :: a | r } -> a

它具有完全相同的类型。这就引出了最后一个问题:

但是为什么呢?

嗯,在某些元编程场景中,您不是为特定符号编程,而是为任何符号编程。假设您想为任何记录编写一个 JSON 序列化程序。您可能想要“迭代”记录的每个 属性,get 值,将值本身变成 JSON,然后将键值对与所有其他键和值连接起来.

可以找到此类实现的示例 here

这可能不是最专业的解释,但这是我的理解。