module - online - ¿Por qué las funciones F#evalúan antes de ser llamadas?
solidity español (2)
Si defino un módulo como tal:
module Module1
open System
let foo =
Console.WriteLine("bar")
Entonces, en interactivo haz
#load "Library1.fs" //where the module is defined
open Module1
veo un
[Cargando c: / users / jj / documents / visual studio 2015 / Projects / Library1 / Library1 / Library1.fs] bar
¡Indicando que la función foo se ejecutó sin que yo la llamara!
¿Cómo / por qué sucede esto? Hay alguna manera de prevenirlo?
Soy consciente de que el valor de retorno de foo es el que se evalúa (Console.Writeline ("bar")) y que no hay ningún motivo que no pueda evaluarse "de inmediato". (¿Cuando el módulo está cargado, supongo?), pero ¿hay alguna manera de evitar que ocurra? Si las funciones de mi módulo alteran el estado de algunas otras cosas, ¿puedo asegurarme de que no se evalúen hasta que se llamen?
Creo que let foo = x
es esencialmente un valor estático que se evalúa inmediatamente, una vez. Si desea una función sin parámetros, necesitará let foo () = Console.WriteLine("bar")
, usándolo como foo ()
.
Si no desea tener que usar los paréntesis al llamar, type Test () = static member foo with get () = System.Console.WriteLine("bar")
algo como type Test () = static member foo with get () = System.Console.WriteLine("bar")
, utilizándolo como Test.foo
debería funcionar.
Los cuerpos de las funciones se evalúan cuando se llama a la función, tal como lo desea. Tu problema es que foo
no es una función, es una variable.
Para hacer que foo
una función, debes darle parámetros. Como no hay parámetros significativos para darlo, el valor unitario ( ()
) sería el parámetro convencional:
let foo () =
Console.WriteLine("bar")
En consecuencia, una llamada de esta función se vería como foo ()
.