Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
没有参数的F#-函数?_F#_Functional Programming_Unit Type - Fatal编程技术网

没有参数的F#-函数?

没有参数的F#-函数?,f#,functional-programming,unit-type,F#,Functional Programming,Unit Type,当以函数的思维方式思考时,假设函数应该是纯函数,我们可以得出结论,任何没有参数的函数基本上只是一个值。 然而,真实性会妨碍我,如果输入不同,我可能不需要某个函数,如果该函数在计算上很昂贵,如果不需要,我不想对其进行评估。 我找到了一个解决方法,使用let func=…并用func 1或其他什么调用它,但这让读者感到非常不习惯,而且很困惑 这归结为一个问题:在F#中,有没有一种正确的方法可以声明一个零参数的函数,而不必在声明时对其求值?通常的习惯用法是定义函数以一个单位类型的参数(让functio

当以函数的思维方式思考时,假设函数应该是纯函数,我们可以得出结论,任何没有参数的函数基本上只是一个值。
然而,真实性会妨碍我,如果输入不同,我可能不需要某个函数,如果该函数在计算上很昂贵,如果不需要,我不想对其进行评估。
我找到了一个解决方法,使用
let func=…
并用func 1或其他什么调用它,但这让读者感到非常不习惯,而且很困惑


这归结为一个问题:在F#中,有没有一种正确的方法可以声明一个零参数的函数,而不必在声明时对其求值?

通常的习惯用法是定义函数以一个单位类型的参数(
让functionName()=42
)为参数。然后它将被称为
functionName()
。(单位类型只有一个值,即
()

我想您想要的是

然后稍后当你需要读取值时

resource.Value

如果您从未调用Value属性,则
lazy
块中的代码将永远不会运行,但如果您确实调用了它,则该代码将只运行一次。

hmm但您无法使用此语法初始化记录类型(例如,不允许使用type Getter={Name:string;Function:()->string;})。你知道如何解决这个问题吗?谢谢你的回复,但它无法编译。有可能写出这样的记录类型吗?@evolvedmicrobe它使用
单元编译对我来说很好。以更好的方式解决了这个问题的两个要点:任何没有参数的函数基本上都只是一个值,如果不需要,我不想对它求值。
lazy()
@Oliver都很好地解决了这两个问题,实际上,使用
lazy()
将具有不同的内存/性能特征,而且可能并不总是正确的解决方案。(以及该页上的其他内容)进行了更详细的讨论。此建议的缺点是调用
resource.Value
将始终返回相同的值,因为它只执行一次,而“parameterless”函数的返回值在每次调用时可能会有所不同。对,但是如果函数是纯函数,并且没有参数,无论如何,它总是返回相同的值。我可以想到两个函数总是返回不同的值:一个随机数生成器和一个当前日期/时间提供程序。我不知道纯函数在函数术语中意味着什么,但这些似乎是你的懒惰值方法不起作用的有效例子。如果给定相同的输入,函数总是产生相同的输出,那么函数就是“纯”的。我并没有宣称懒惰适用于所有方法,甚至不纯净的函数在某种程度上是不好的。现在我明白了,我只是想澄清哪类函数适合lazy。感谢您花时间解释这些事情-我已经重新阅读了问题,您的解决方案实际上正是OP所追求的:-)人们也可能会采取这样的立场,即值是“基本上没有参数的函数”,这就是Haskell看待事物的方式。我想知道为什么F#在这方面有所不同。@self这是因为Haskell默认也是懒惰的;除非程序员明确要求,否则在声明中不会对任何值(包括函数)求值。默认情况下,F#中的语义是严格的,应该用不同的方式表示。
resource.Value