繁体   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