Создание модулей / типов, видимых только для проектов F # - PullRequest
3 голосов
/ 28 февраля 2012

Можно ли сделать модуль или тип видимым только для проектов F #?Активные шаблоны не видны другим языкам, но я предполагаю, что это связано с тем, что они не являются допустимыми идентификаторами на этих языках.Есть ли другой способ достижения того же эффекта для модулей / типов?

Ответы [ 4 ]

3 голосов
/ 29 февраля 2012

Это ужасно?

[<AutoOpen>]
module ``(|Hidden|)`` = 
  module MyModule =
    let f() = ()

MyModule появляется только в F #.

1 голос
/ 29 февраля 2012

У меня была похожая проблема.В моем случае я реализовал некоторую асинхронную функциональность в F # и хотел иметь по существу тот же API, но возвращающий Async<T> для F #, Task<T> для потребителей C # 5 и просто T для людей, которые не хотятиметь дело с async.

В итоге я создал три подпространства имен (Async, Sync и FSharp) и определил один и тот же интерфейс во всех трех пространствах имен, различающихся только типом возвращаемого значения.

Затем в классе, содержащем фактическую реализацию, я реализовал все три интерфейса и создал набор статических методов фабрики, которые просто создают экземпляр класса и приводят его к соответствующему интерфейсу.

Потребители могут затем вызыватьSomeClass.CreateAsync() или SomeClass.CreateSync() или SomeClass.CreateFSharp(), чтобы получить интерфейс, соответствующий их среде.Им не нужно явно открывать ни одно из трех подпространств имен.

Полагаю, я также мог бы сделать это с точки зрения методов расширения, по крайней мере, если бы я хотел только две реализации.F # может определять как методы расширения F # -стиля, так и C # -стиля, но потребитель C # игнорирует расширения F #, а потребитель F # игнорирует расширения C #.

1 голос
/ 29 февраля 2012

Я думаю, что я мог бы просто поместить API, специфичные для F #, в модуль F # и добавить комментарий к модулю, который направляет людей C # в соответствующие им пространства / типы имен.

0 голосов
/ 29 февраля 2012

Я думаю, что это будет работать:

Везде, где есть

let ...

замените его на

let inline ...

тогда функции нельзя вызывать из C #, так как компилятор C # не может использовать встроенные функции F #

...