Форум программистов, компьютерный форум, киберфорум
DevAlt
Войти
Регистрация
Восстановить пароль

Модульный подход на примере F#

Запись от DevAlt размещена 06.03.2026 в 05:15
Показов 4057 Комментарии 0
Метки .net, f#, fsharp

В блоге дяди Боба наткнулся на такое определение:

В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры, которые поддерживают варианты использования системы.

Другими словами модули.
В C# полноценным модулем является класс.
Сборку можно считать библиотекой.
Попробуем решить простую задачу. Например, имитацию случайности.
F#
1
type Value = Yes | No //  пусть нам требуется получить результат в данном виде
тогда нам необходима функция которая возвращает значение:
F#
1
2
3
4
5
6
7
8
type ValueGenerator = unit -> Value 
(*
примеры можно запускать в интерактивной среде
dotnet fsi --nologo --warnaserror --reflectionfree --gui --realsig+ --checknulls+
но в этом случае невозможно определить сигнатуру функции в том виде в котором компилятор
ее выводит (см. ниже) 
*)
val valueGenerator :  unit -> Value
Если мы используем NET10 мы можем использовать BCL для реализации функции, таким образом
F#
1
2
3
4
5
6
open System
 
let valueGenerator () =
     let size = 10
     let x = Random.Shared.GetItems (Array.init size ((+)1), 1) |> Array.head
     if (float size)/(float x) > 2. then Yes else No
Отлично! Есть маленькое но. Хотелось бы побольше информации о работе функции.
Не вопрос
F#
1
2
3
4
5
6
7
type Value =
  | Yes of num: int
  | No of num: int
 
let valueGenerator size =
     let x = Random.Shared.GetItems (Array.init size ((+)1), 1) |> Array.head
     if (float size)/(float x) > 2. then Yes x else No x
Теперь мы знаем размер массива и знаем какое число выпало в результате работы,
что дает нам возможность убедится в корректности работы функции.
Что ж. Оформим, наконец, наш код в виде модуля.
F#
1
2
3
4
5
6
7
8
9
10
11
12
13
type AwesomeGenerator (size) =
     member _.GetValue () =
         valueGenerator size
(* ниже интерфейс класса и пример использования *)
type AwesomeGenerator =
  new: size: int -> AwesomeGenerator
  member GetValue: unit -> Value
 
let awesome = AwesomeGenerator 100
 
match awesome.GetValue () with
| Yes n -> printfn "YES is %d." n 
| No n -> printfn "NO is %d." n
Поскольку к понятию модуля более подходит именно класс в силу того, что изначально платформа
проектировалась под C# ООП, то что же в таком случае модуль F#?
Формально тоже самое, но более обобщенное в плане типизиции и с учетом специфики ФП.
Метки .net, f#, fsharp
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru