- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Sproxy 在纯脚本中有什么用?
在Pursuit中,它写成
data SProxy (sym :: Symbol)
--| A value-level proxy for a type-level symbol.
purescipt 中的 Symbol 是什么意思?
最佳答案
首先,请注意 PureScript 从 0.14 版本开始就有了 polykinds,并且大多数函数现在使用 Proxy
而不是 SProxy
。 Proxy
基本上是 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/
Sproxy 在纯脚本中有什么用? 在Pursuit中,它写成 data SProxy (sym :: Symbol) --| A value-level proxy for a type-level
我是一名优秀的程序员,十分优秀!