【发布时间】:2017-07-28 19:53:41
【问题描述】:
我是 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/
问题:
你如何解决这个错误?
是不是因为推理类型默认采用与属性匹配的最后一个声明类型(在我的示例中为 Vector)?
奖励:在 F# 中是否有更好的方法来处理这种情况?
提前致谢
【问题讨论】:
标签: f# type-inference