F # верхний уровень сделать привязку - PullRequest
0 голосов
/ 24 июня 2011

У меня есть файл с модулем с некоторыми подпрограммами, которые принимают параметры и возвращают единицу, эти подпрограммы имеют побочные эффекты. Я заметил, что при доступе к этим подпрограммам f # из c # они на самом деле являются свойствами типа unit, а когда я пытаюсь получить доступ к 1 свойству, он запускает все свойства в модуле.

Из документации F # все привязки верхнего уровня выполняются при инициализации типа.

Каков предпочтительный способ написания функций, которые должны не выполняться при инициализации типа, но также не связаны с другим состоянием, то есть классом с функциями и переменными-членами?

Должен ли я поместить эти функции в тип и просто не иметь записей в типе?

Пример кода:

namespace test_space

open System.Diagnostics;

module test =
    let test_1 =
        Debug.WriteLine ("One")

    let test_2 =
        Debug.WriteLine ("Two")

Я запускаю этот код с C #:

static void Main (string [] args)
{
    Object o;

    o = test.test_2;
}

И вывод:

One
Два

Ответы [ 2 ]

3 голосов
/ 24 июня 2011

Проблема в том, что вы создали не функции, а привязки значений. test_1 - это значение test_1 () является функцией типа unit -> unit. Убедитесь, что вы поставили () после имени функции.

0 голосов
/ 24 июня 2011

Я не совсем понимаю сценарий, который вы описываете - функции F #, объявленные в модуле, обычно отображаются как методы, а значения отображаются как свойства. Код, который выполняется при первом обращении к модулю (инициализация типа), является инициализацией значений.

Если вы напишите просто:

module Foo =
  let Operation () = 
    printfn "hello"

... тогда вызов Operation будет методом, а вызов Foo.Operation() вызовет побочный эффект. Если вы можете опубликовать некоторый код, который ведет себя неожиданно, тогда кто-то может объяснить это.

В любом случае, если вы хотите быть уверены в поведении, вы можете написать операции как статические члены класса:

type Foo = 
  static member Operation() =
    printfn "hello"

Тогда вы можете быть уверены, что F # скомпилирует их как статические члены класса предсказуемым образом.

...