Другие ответы показывают, как это сделать, используя более сложные методы функционального программирования, такие как выражения для вычисления или значения option
. Они определенно полезны и имеют смысл, если вы делаете это во многих местах вашей системы.
Однако, если вам нужен простой способ изменить код, чтобы поток управления был более понятным ( не делая это более умным), я бы отрицал условия. Ранее у вас было:
if something then
moreStuff()
Some result
else
None
Вы можете переписать это, вернув None
, если not something
. Я думаю, что соглашение о кодировании F # в этом случае также позволяет вам удалять отступы, так что это больше похоже на обязательный досрочный возврат:
if not something then None else
moreStuff()
Some result
При этом вы можете написать свою исходную функцию следующим образом - без каких-либо дополнительных умные трюки:
let getBuildDate (assembly: Assembly) : DateTime option =
let buildVersionMetadataPrefix = "+build"
let attribute = assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()
if attribute = null || attribute.InformationalVersion = null then None else
let value = attribute.InformationalVersion
let index = value.IndexOf(buildVersionMetadataPrefix)
if index <= 0 then None else
let value = value.Substring(index + buildVersionMetadataPrefix.Length)
let success, timestamp = DateTime.TryParseExact(value, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.None)
if not success then None else
Some timestamp