Первой проблемой является list |> List.rev |> List.head
, вызывая при составлении компилятора list
типа unit
. Если вы удалите эту строку (поскольку она бессмысленна, списки F # неизменяемы, поэтому вы вычисляете неиспользуемое значение), правильно выведено значение list
, чтобы иметь тип int list
, из-за которого первая ошибка уходит (если мы также используем List.head list
вместо list.Head
сделать вывод типа счастливым).
Затем появляется вторая ошибка в этой строке if min<=0 then min <- List.nth list i |>ignore
, которая имеет смысл, поскольку присвоение изменчивой переменной не должно ничего оставить |> ignore
. Таким образом, позволяет избавиться от этого, исправить предупреждение устаревания и добавить немного форматирования ... это компилирует:
let replace touple2 =
let first (a,_,_,_,_) = a
let second (_,b,_,_,_) = b
let third (_,_,c,_,_) = c
let forth (_,_,_,d,_) = d
let fifth (_,_,_,_,e) = e
let sortedlist list= List.sort(list)
let GetMin list=
let mutable min = List.head list
let mutable i = 1
for i in list do
if min <= 0 then min <- List.item i list
min
let GetMax list = list |> List.rev |> List.head
let A = first touple2
let B = second touple2
let C = third touple2
let D = forth touple2
let E = fifth touple2
let mylist = [A;B;C;D;E]
let L = sortedlist mylist
let m1 = GetMax L
printfn "%d" m1
let touple3 = 14,6,18,76,76
replace touple3
Тем не менее, это не выглядит F # -ish.Как об этом (в том числе диких догадывается, что вы хотите достичь):
let printMinMax (a, b, c, d, e) =
let minPositive sortedList =
sortedList |> List.fold (fun m e -> if m <= 0 then e else m) sortedList.Head
let max sortedList = sortedList |> List.last
let sortedList = [ a; b; c; d; e ] |> List.sort
printfn "min %d, max %d" (minPositive sortedList) (max sortedList)
let t1 = 14, 6, 18, 76, 76
printMinMax t1
let t2 = -1, -5, 5, 16, 12
printMinMax t2
Это может дополнительно улучшить, но я боюсь, что подключение к оригиналу становится еще менее очевидным (и он ожидает, по меньшей мере, одно положительное значение, чтобы быть настоящее время):
let minMax (a, b, c, d, e) =
let l = [ a; b; c; d; e ] |> List.sortDescending
let positiveMin = l |> List.findBack ((<) 0)
let max = l.Head
positiveMin, max
let t1 = 14, 6, 18, 76, 76
let t2 = -1, -5, 5, 16, 12
let test t =
let min, max = minMax t
printfn "min (positive) %d, max %d" min max
test t1
test t2
Предполагается, что это головоломка для читателей? :) Попробуйте использовать parens, если вы не уверены в границах выражений. –
Разве вы не спросили об этом 2 часа назад? http://stackoverflow.com/q/32720710/126014 –
Возможный дубликат? –