Как говорит Инь Чжу, модули могут содержать значения. И вы можете открывать модули, такие как пространства имен. Эти две функции вместе, поэтому в F # вы можете делать такие вещи, как
let z = max x y
тогда как на языке, подобном C #, вы всегда должны говорить что-то вроде
var z = Math.Max(x,y)
// ^^^^^ can't call methods from elsewhere without a qualifier
и используйте полное имя (SomeClass.Method
), а не просто имя (letBoundFunction
). Таким образом, вы можете использовать модули, когда хотите, чтобы люди могли открывать вам модуль Foo
и вызывать bar
, просто сказав bar
вместо Foo.bar
везде. (Это особенно полезно для операторов, например, если вы определяете набор пользовательских операторов (таких как +++
или еще много чего) в библиотеке, помещая их в модуль, люди могут открыть модуль, а затем просто использовать, например, x +++ y
, а не громоздкие вещи вроде (Foo.+++) x y
или что-то в этом роде.)
Обратите внимание, что, хотя F # по умолчанию помещает код в файл .fs в модуле (с именем файла), вы можете изменить это, указав в качестве первого кода в файле объявление пространства имен, например,
namespace Yadda
// declare some types or whatnot, they go in namespace Yadda
или объявив свой собственный модуль
module Blah
// stuff goes in Blah module
вверху файла.