cae*_*eus 1 macros f# functional-programming scala referential-transparency
我对 F# 不是很了解,但我喜欢函数式编程,因此我使用 F# 作为我的一些个人项目的灵感。
最近在读一篇关于F#新特性的文档,很喜欢其中操作符的一部分nameof。
然而,在深入研究这个想法之后,我意识到它可能不是引用透明的......就像这样,表达式可以被它的值替换,反之亦然,而且它就可以工作。
所以...
let sum = +;
nameof (sum)
Run Code Online (Sandbox Code Playgroud)
应该返回相同的
nameof (+)
Run Code Online (Sandbox Code Playgroud)
但他们不...
那么……缺乏引用透明度是故意的吗?函数式程序员如何将其与函数式编程的原则相协调?
在写这个问题时,我意识到它的nameof行为就像一个宏,因此,同样的问题也适用于宏。
FP 程序员如何协调宏的非引用透明度与 FP 原则?
nameof不是传统意义上的函数或运算符。它是一种元编程功能,可根据 F# 编译器进行名称解析的方式发出名称的字符串表示形式。这也是为什么在编辑器中,它被着色为关键字而不是任何其他 F# 函数。
下列:
let sum = +;
nameof (sum)
Run Code Online (Sandbox Code Playgroud)
屈服sum不仅是设计的问题,而且正是 F# 和 .NET 程序员期望从此功能中获得的行为,特别是因为这(或多或少)也是 C# 所做的。nameof我个人认为,如果某个被调用的东西不直接给出我正在传递给它的东西的名称,那将是非常出乎意料的。