Sar*_*nan 4 functional-programming purescript
PureScript中Sproxy有什么用?
在追求中,它被写成
data SProxy (sym :: Symbol)
--| A value-level proxy for a type-level symbol.
Run Code Online (Sandbox Code Playgroud)
purescipt 中的 Symbol 是什么意思?
首先,请注意,从 0.14 版开始,PureScript 现在具有多种类型,并且大多数函数现在使用Proxy而不是SProxy. Proxy基本上是 的概括SProxy。
PureScript 知道值级别字符串(称为String)和类型级别字符串(称为Symbol)。
String在运行时可以具有任何字符串值。编译器不跟踪字符串的值。Symbol不同,它只能有一个值(但请记住,它是在类型级别上)。编译器会跟踪该字符串。这允许编译器对某些表达式进行类型检查。符号最突出的用途是在记录中。Record 和 String-Map 之间的区别在于,编译器在编译时就知道键并且可以进行类型检查查找。
现在,有时我们需要弥合这两个世界之间的差距:类型级别和值级别世界。也许您知道 PureScript 记录在官方编译器中被实现为 JavaScript 对象。这意味着我们需要以某种方式从我们的符号接收一个字符串值。这个神奇的函数reflectSymbol可以让我们把一个符号变成一个字符串。但符号是在类型级别上的。这意味着我们只能在可以写类型的地方写一个符号(例如在类型定义之后::)。这就是代理黑客的用武之地。这SProxy是一个简单的值,通过应用它来“存储”类型。
例如,get函数 frompurescript-records允许我们从记录中获取属性的值。
get :: forall proxy r r' l a. IsSymbol l => Cons l a r' r => proxy l -> Record r -> a
Run Code Online (Sandbox Code Playgroud)
如果我们应用第一个参数,我们会得到:
get (Proxy :: Proxy "x") :: forall r a. { x :: a | r } -> a
Run Code Online (Sandbox Code Playgroud)
现在您可能会说,只需编写以下内容即可获得相同的功能:
_.x :: forall r a. { x :: a | r } -> a
Run Code Online (Sandbox Code Playgroud)
它具有完全相同的类型。这引出了最后一个问题:
好吧,在某些元编程场景中,您不是针对特定符号进行编程,而是针对任何符号进行编程。想象一下您想要为任何记录编写一个 JSON 序列化程序。您可能想要“迭代”记录的每个属性(get值),将值本身转换为 JSON,然后将键值对与所有其他键和值连接起来。
可以在此处找到此类实现的示例
这可能不是最技术性的解释,但这就是我的理解。