F#类型和函数签名

F#类型和函数签名,f#,type-inference,F#,Type Inference,我对F#还不熟悉,我正试着做一些事情来让我的头脑了解这门语言 我有两种几乎相同的类型(坐标和向量)。由于这种类型推断无法正常工作,我很难在每个函数上指定正确的类型 这是一个向量: type Coordinate = {X:int; Y:int} type Vector = {X:int; Y:int} let calculateVector (origin:Coordinate) (destination:Coordinate) = { X=destination.X-origin.X; Y=

我对F#还不熟悉,我正试着做一些事情来让我的头脑了解这门语言

我有两种几乎相同的类型(坐标和向量)。由于这种类型推断无法正常工作,我很难在每个函数上指定正确的类型

这是一个向量:

type Coordinate = {X:int; Y:int}
type Vector = {X:int; Y:int}

let calculateVector (origin:Coordinate) (destination:Coordinate) = { X=destination.X-origin.X; Y= destination.Y-origin.Y;}
在这里,当我需要坐标的返回类型时,我找不到如何为此函数指定返回类型:

let calculateNextCoordinate (coordinate:Coordinate) direction = 
   match direction with
   | "N" -> { X=coordinate.X; Y=coordinate.Y-1 }
   | "NE" -> { X=coordinate.X+1; Y=coordinate.Y-1 }
   | "E" -> { X=coordinate.X+1; Y=coordinate.Y }
   | "SE" -> { X=coordinate.X+1; Y=coordinate.Y+1 }
   | "S" -> { X=coordinate.X; Y=coordinate.Y+1 }
   | "SW" -> { X=coordinate.X-1; Y=coordinate.Y+1 }
   | "W" -> { X=coordinate.X-1; Y=coordinate.Y }
   | "NW" -> { X=coordinate.X-1; Y=coordinate.Y-1 }
   | _ -> coordinate
我在默认情况下有一个错误:这个表达式应该有“Vector”,但这里有“Coordinate”类型

我很想在这个网站上查看函数签名,但无法找到解决我问题的方法:

问题:

如何修复此错误

是因为推断类型默认采用与属性匹配的最后一个声明类型(在我的示例向量中)

奖励:有没有更好的方法来处理这种情况


提前感谢

,因为记录是使用其成员名称构建的:

{ X = 2; Y = 3}
您在矢量和坐标之间创建了命名冲突。在F#中,编译器在这种情况下总是解析为最新的定义,因此,在您的示例中,编译器将记录{X=…,Y=…}解释为向量

关于,有一篇很好的文章,解释了如何轻松处理这个问题,我建议您阅读这篇文章以获得很好的解释

但简而言之,您可以在记录实例的任一成员前面加上记录类型前缀:

{ Coordinate.X = 2; Y = 3 }  // Creates a Coordinate
{ X = 2; Coordinate.Y = 3 }  // Creates a Coordinate


非常感谢我一直在寻找的东西,链接非常好。
{ Vector.X = 2; Y = 3 } // creates a vector