Совместное использование разрозненных союзов в файлах подписей - PullRequest
2 голосов
/ 09 апреля 2009

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

Signature.fsi:

type Union =
| Part of string
| Part2 of int

val Func: Union -> unit

С определением Func в отдельном файле fs.

Проблема в том, что когда я делаю это, файл fs не может подобрать определение Union, поэтому код, который создает значение Part или Part2, завершается ошибкой. Если я снова не определю объединение в файле fs, который использует объединение.

Так, например:

Signature.fs:

type Union =
| Part of string
| Part2 of int

let Func input:Union =
    ignore

OtherFile.fs

type Union =
| Part of string
| Part2 of int

let DoSomething =
    Func(Part("Test"))

Без переопределения Союза каждый раз, когда это терпит неудачу. Я что-то упустил очевидное? Я все еще довольно зеленый, когда дело доходит до F #.

Ответы [ 2 ]

4 голосов
/ 09 апреля 2009

Я думаю, вы ищете что-то вроде этого:

Test.fsi:

#light

type Union =
    | Part of string
    | Part2 of int

val awesome: Union -> unit

Test.fs:

#light

type Union =
    | Part of string
    | Part2 of int

let awesome (x :Union) = printfn "%A" x

Это создает модуль с именем Test, к которому вы можете получить доступ из других файлов:

AnotherTest.fs:

#light

let wickedAwesome() =
    Test.awesome(Test.Part("hellz yeah!"))

Если вы open модуль Test, вы можете переписать AnotherTest.fs следующим образом:

#light
open Test

let wickedAwesome() =
    awesome (Part("hellz yeah!"))

См. F # Модули и пространства имен для более подробного руководства.

1 голос
/ 09 апреля 2009

Ваш проект f # должен упорядочить файлы в правильном порядке. Это означает размещение файла, содержащего определение Func, выше (буквально), чем файлы, использующие его. Возможно, вы захотите вместо этого разместить такие определения в файлах fsi.

Я хотел бы отметить, что использование имени типа Func - это действительно плохая идея, учитывая распространенность (и предположение большинства пользователей), что Func означает стандартных делегатов 3.5 (* -> x) .

...