Есть несколько проблем с вашим буквальным переводом.Прежде всего, существует непосредственная проблема, которая вызывает ошибку компилятора: как уже отмечали другие, пусть привязки по умолчанию неизменны.Однако есть по крайней мере еще одна большая проблема: System.Collections.Generic.List<T>
очень отличается от F # 't list
.Тип BCL является изменяемым списком, поддерживаемым массивом, который обеспечивает постоянный произвольный доступ к элементам;тип F # является неизменяемым односвязным списком, поэтому доступ к n-му элементу занимает O (n) времени.Если вы настаиваете на переводе с выражением по выражению, вы можете найти этот пост в блоге Брайана ценным.
Я настоятельно рекомендую вам следовать советам других и попытаться акклиматизироваться.думать в идиоматическом F #, а не переводить буквально C #.Вот несколько способов написания некоторых связанных функций на F #:
// Given an F# list, find the minimum element:
let rec getMinList l =
| [] -> failwith "Can't take the minimum of an empty list"
| [x] -> x
| x::xs ->
let minRest = getMin xs
min x minRest
Обратите внимание, что это работает со списками любого типа элемента (с оговоркой, что тип элемента должен быть comparable
с точки зрения F # илиприменение функции приведет к ошибке времени компиляции).Если вам нужна версия, которая будет работать с любым типом последовательности, а не только со списками, вы можете основывать ее на функции Seq.reduce
, которая применяет функцию, предоставленную в качестве первого аргумента, к каждой паре элементов в последовательности до единогозначение остается.
let getMin s = Seq.reduce min s
Или, что лучше всего, вы можете использовать встроенную функцию Seq.min
, которая эквивалентна.