2017-07-28 54 views
4

我是F#的新手,我正在尝试一些事情来让我的头脑对这个语言感兴趣。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'类型

我累了有这个网站的功能特征上一看,但不能为东西我的问题:https://fsharpforfunandprofit.com/posts/function-signatures/

问题:

你如何解决这个错误?

是因为推理类型默认情况下采取声明的最后一个类型匹配的属性(在我的例子向量)是什么?

奖励:有没有更好的方式来处理这种情况在F#?

在此先感谢

回答

6

由于使用的是他们的成员名称构成记录:

{ X = 2; Y = 3} 

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

有上F# records on fsharpforfunandprofit.com好文章,解释如何处理这一点很容易,我建议你阅读的一个很好的解释。

但总之,你可以前缀记录类型的记录实例的任一成员:

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

{ Vector.X = 2; Y = 3 } // creates a vector 
+0

谢谢正是我一直在寻找,并联系好才是真的好。 –