2015-09-22 2 views
1

У меня есть следующий код. в этой строкеОжидается, что это выражение будет иметь блок типа

if min<=0 then  min <- List.nth list i |>ignore 

У меня есть 2 ошибки. первым в 0 это

This expression was expected to have type 
    unit  
but here has type 
    int 

, а затем в i это

This expression was expected to have type 
    unit  
but here has type 
    int 

* Я также видел this и пытался игнорировать, но он не работает

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= 
     list |> List.rev |> List.head 
     let mutable min=list.Head 
     let mutable i=1 
     for i in list do  
      if min<=0 then  min <- List.nth list i |>ignore 

     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 
+0

Предполагается, что это головоломка для читателей? :) Попробуйте использовать parens, если вы не уверены в границах выражений. –

+0

Разве вы не спросили об этом 2 часа назад? http://stackoverflow.com/q/32720710/126014 –

+0

Возможный дубликат? –

ответ

3

Вам просто нужны скобки, чтобы ваши намерения были ясны компилятору:

if min <= 0 then (min <- List.nth list i) |> ignore 

Условный без еще в F # является обобщающим для:

if condition then doSomething else() 

Это означает, что результат все, что внутри doSomething блока должен быть типа unit. Поскольку назначение в F # является выражением, ваш код возвращал min, значение int. Это объясняет вашу первую ошибку.

выше произошло потому, что без скобок, оператор трубопровода использует последний параметр ОС List.nth, в i в качестве параметра ignore

5

Вам не нужен ignore - если вы используете назначение, он возвращает unit и поэтому не имеет какого-либо значения возврата, которые должны быть проигнорированы:

if min <= 0 then min <- List.nth list I 

Тем не менее, это не очень функциональный подход. Таким образом, поиск в базовой книге F # или просмотр нескольких разговоров может помочь вам начать работу с langauge в более стиле F #.

0

Первой проблемой является 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 
Смежные вопросы