gpt4 book ai didi

functional-programming - 纯脚本中的 SProxy?

转载 作者:行者123 更新时间:2023-12-05 01:54:09 24 4
gpt4 key购买 nike

Sproxy 在纯脚本中有什么用?

在Pursuit中,它写成

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

purescipt 中的 Symbol 是什么意思?

最佳答案

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

关于符号和字符串

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

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

实践中的符号

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

现在,有时我们需要弥合这两个世界之间的鸿沟:类型层面和值(value)层面世界。也许您知道 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 序列化程序。您可能想要“迭代”记录的每个属性,获取 值,将值本身转换为 JSON,然后将键值对与所有其他键和值连接起来。

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

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

关于functional-programming - 纯脚本中的 SProxy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70820247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com