2016-02-18 32 views
7
let distance (x:(float * float)): float = 
    sqrt ((fst x * fst x) + (snd x * snd x)) 

let getClosestPair (pairs:(float * float) list) = 
    let mutable closest = (0.0, 0.0) 
    if List.isEmpty pairs then 
     (infinity, infinity) 
    else 
     closest <- pairs.[0] 
     for i in pairs do 
      if (distance i) < (distance closest) then closest <- i 

Yukarıdaki işlev, float çiftlerinin bir listesi üzerinden geçer. Her bir çift kartezyen düzlemde bir koordinat gibi davranır. İşlev, kaynağa en yakın çifti bulur. Alttaki for döngüsü bir tür hata üretir.F # hata: Yanlış tür bekleniyor?

"This expression was expected to have type float * float but here has type unit"

Bu hatayı nasıl düzeltirim? if bloğunda

cevap

9

Bir float * float başlığın dönüyor, ama else blokta Eğer closest değişkeni mutasyona ve unit dönüyor. Bu iki blok aynı türde dönmelidir.

bu şekilde else blok değiştirme

: Eğer sırayla hem if bir float * float başlığın dönüyor sağlayacaktır else blokta closest değişkenin, nihai sonucunu dönüyor sağlar

else 
    closest <- pairs.[0] 
    for i in pairs do 
     if (distance i) < (distance closest) then closest <- i 
    closest 

ve else yolları.

+0

Wow ... Bunu özlediğime inanamıyorum. Çok teşekkür ederim! – pooperdooper

+1

Endişeye gerek yok. İkinci bir göz seti asla acıtmaz. –

İlgili konular