F#错误:预计错误的类型?

poo*_*per 7 f# types casting

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
Run Code Online (Sandbox Code Playgroud)

上面的函数通过浮点对列表.每一对都像笛卡尔平面上的坐标.该函数找到与原点最接近的一对.底部的for循环生成类型错误.

"这个表达式预计有float*float类型,但这里有类型单位"

我该如何解决这个错误?

Jas*_*own 9

在if块中,您将返回一个float * float元组,但在else块中,您正在closest变量并返回unit.这两个块必须返回相同的类型.

将您的else块更改为:

else
    closest <- pairs.[0]
    for i in pairs do
        if (distance i) < (distance closest) then closest <- i
    closest
Run Code Online (Sandbox Code Playgroud)

这确保您正在返回的最终结果closest在变量else块,这将反过来确保您正在返回一个float * float在两个元组if和else路径.