2016-02-18 6 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 

上記の機能は、浮動小数点のペアのリストを通過します。各対は、デカルト平面上の座標のように動作する。この関数は、原点に最も近いペアを見つけます。一番下のforループは型エラーを生成します。F#エラー:間違ったタイプが予想されますか?

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

どうすればこのエラーを修正できますか?あなたがfloat * floatタプルを返しているが、elseブロックにあなたがclosest変数を変異とunitを戻ってきているifブロックで

答えて

9

。これらの2つのブロックは、同じタイプを返す必要があります。

はこれにあなたの elseブロックを変更

:あなたは順番にあなたが両方のiffloat * floatタプルを返していることを確認しますelseブロックでclosest変数、最終的な結果を返すされることを保証

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

をパスはelseです。

+0

うわー...私はそれを逃したとは思わない。どうもありがとうございます! – pooperdooper

+1

心配はいりません。第2の目は決して痛くない。 –

関連する問題