Вы можете использовать mutable
переменную и написать код, используя for
цикл, так же, как в C#. Однако, если вы делаете это, чтобы узнать F # и функциональные концепции, тогда рекомендуется использовать рекурсию.
В этом случае рекурсивная функция немного длиннее, но она демонстрирует ключевые понятия, включая сопоставление шаблонов, поэтому изучение трюков - это то, что будет полезно при написании более сложного кода F #.
Основная идея состоит в том, чтобы написать функцию, которая принимает наибольшее значение, найденное до сих пор, и вызывает себя рекурсивно, пока не достигнет конца списка.
let max_list list =
// Inner recursive function that takes the largest value found so far
// and a list to be processed (if it is empty, it returns 'maxSoFar')
let rec loop maxSoFar list =
match list with
// If the head value is greater than what we found so far, use it as new greater
| head::tail when head > maxSoFar -> loop head tail
// If the head is smaller, use the previous maxSoFar value
| _::tail -> loop maxSoFar tail
// At the end, just return the largest value found so far
| [] -> maxSoFar
// Start with head as the greatest and tail as the rest to be processed
// (fails for empty list - but you could match here to give better error)
loop (List.head list) (List.tail list)
В заключение это будет медленным, потому что оно использует общее сравнение (через интерфейс). Вы можете сделать функцию быстрее, используя let inline max_list list = (...)
. Таким образом, код будет использовать собственную инструкцию сравнения при использовании с примитивными типами, такими как int
(это действительно особый случай - проблема действительно происходит только при общем сравнении)
I предположим, что вы не хотите просто вызывать ['List. max'] (http://msdn.microsoft.com/en-us/library/vstudio/ee370242.aspx), правильно? – svick
что правильно – Jacco