F# - 没有参数的函数?

Rub*_*bys 35 f# functional-programming unit-type

在思考功能性思维模式时,假设函数应该是纯粹的,那么可以断定任何没有参数的函数基本上只是一个值.
然而,reallity阻碍了,并且对于不同的输入,我可能不需要某个函数,并且如果该函数在计算上是昂贵的,那么如果不需要它我不想评估它.
我找到了一个解决方法,使用let func _ = ...func 1或其他任何东西来调用它,但这对读者来说非常非惯用且令人困惑.

这归结为一个问题:在F#中,是否有一种正确的方法来声明一个零参数的函数,而没有在声明中进行评估?

sep*_*p2k 53

通常的习惯用法是定义函数以获取Unit(let functionName () = 42)类型的一个参数.它将被称为functionName ().(单位类型只有一个值,即().)


Joe*_*ler 14

我想你想要的是懒惰.

let resource = 
    lazy(
        // expensive value init here
    )
Run Code Online (Sandbox Code Playgroud)

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

resource.Value
Run Code Online (Sandbox Code Playgroud)

如果你从不调用Value属性,那么lazy块中的代码永远不会被运行,但如果你调用它,那么该代码将只运行一次.

  • 是的,但是如果函数在函数方面是纯函数并且没有参数,它无论如何都会返回相同的值。 (3认同)
  • 如果一个函数在给定相同的输入的情况下总是产生相同的输出,那么它就是“纯”函数。我并没有声称所有方法都适用懒惰的方法,甚至不纯的函数在某些方面都是不好的。只是澄清惰性函数适合哪类函数。 (2认同)