Мой пример - лишь небольшое улучшение по сравнению с кодом, опубликованным 'ssp'. Он использует параметризованные активные шаблоны (которые принимают в качестве аргумента делитель). Вот более подробное объяснение:
Следующее определяет активный шаблон , который мы можем позже использовать в match
выражение для проверки, если значение i
делится на значение divisor
. Когда мы пишем:
match 9 with
| DivisibleBy 3 -> ...
... это означает, что значение '9' будет передано следующей функции как i
, а значение 3
будет передано как divisor
. Имя (|DivisibleBy|_|)
- это специальный синтаксис, который означает, что мы объявляем активный шаблон (и имя может появиться в
match
на левой стороне ->
. Бит |_|
означает, что шаблон может потерпеть неудачу (наш пример завершается ошибкой, когда значение не делится на divisor
)
let (|DivisibleBy|_|) divisor i =
// If the value is divisible, then we return 'Some()' which
// represents that the active pattern succeeds - the '()' notation
// means that we don't return any value from the pattern (if we
// returned for example 'Some(i/divisor)' the use would be:
// match 6 with
// | DivisibleBy 3 res -> .. (res would be asigned value 2)
// None means that pattern failed and that the next clause should
// be tried (by the match expression)
if i % divisor = 0 then Some () else None
Теперь мы можем перебирать все числа и сопоставлять их с шаблонами (нашим активным шаблоном), используя match
(или используя Seq.iter
или другой метод, как показано в других ответах):
for i in 1..100 do
match i with
// & allows us to run more than one pattern on the argument 'i'
// so this calls 'DivisibleBy 3 i' and 'DivisibleBy 5 i' and it
// succeeds (and runs the body) only if both of them return 'Some()'
| DivisibleBy 3 & DivisibleBy 5 -> printfn "FizzBuzz"
| DivisibleBy 3 -> printfn "Fizz"
| DivisibleBy 5 -> printfn "Buzz"
| _ -> printfn "%d" i
Для получения дополнительной информации об активных шаблонах F #, вот ссылка на документацию MSDN . Я думаю, что если вы удалите все комментарии, код будет немного более читабельным, чем оригинальная версия. Он показывает некоторые довольно полезные трюки :-), но в вашем случае задача относительно проста ...