选项和类型确定f#

时间:2012-12-17 16:41:26

标签: types f#

我正在做一个名为“2dShapeEditor”的项目,您应该可以在表单上创建,单击和拖动不同类型的形状。在我现在的项目阶段,我需要确定我的目标矩形是什么类型的。它被初始化为“选项”,但可以通过“点击”更改到单击的特定矩形。

然后我将我的移动方法应用于此矩形,使其随鼠标移动。

我的类型RectangleZ

type RectangleZ(x:int, y:int)= 
  let mutable thisx = x
  let mutable thisy = y
  let mutable thiswidth = 50
  let mutable thisheight = 20
  let brush = new SolidBrush(Color.Black)
  member obj.x with get () = thisx and set x = thisx <- x
  member obj.y with get () = thisy and set y = thisy <- y
  member obj.width with get () = thiswidth and set width = thiswidth <- width
  member obj.height with get () = thisheight and set height = thisheight <- height
  member obj.thisColor = Color.FromArgb(167, 198, 253)
  member obj.draw(paper:Graphics) = paper.FillRectangle(brush, thisx, thisy, 50, 20)
  member obj.ShapeType = "Rectangle"

我最热门的方法:

let rec getShape (e:MouseEventArgs) (inputl:List<RectangleZ>) = match inputl with 
                                                               |[] -> None
                                                               |s::tail->if(((e.X >= s.x) && (s.x <= (s.x + s.width))) && ((e.Y >= s.y) && (e.Y <= (s.y + s.height)))) then Some(s) else getShape e tail //Some(s)

我的目标矩形如下所示:

let mutable targetedRec = None 

我的“Move()”方法如下所示:

let Move (e:MouseEventArgs) = if(targetedRec = None) then None else targetedRec.Value.x <- e.X
                                                                    targetedRec.Value.y <- e.Y

“Move()”方法给出了错误:“基于此前的信息查找不确定类型的对象 计划点。在此程序之前可能需要类型注释来约束对象的类型。这可能允许解析查找。“

是的,编译器给了我一些错误以及如何修复的提示,我尝试过匹配,if语句,我根本不明白什么是错的以及如何解决它。如果我删除了targetedRec的Option类型并将其作为“RectangleZ”的类型放了很多我的项目将会失败,因为我不能留空if语句。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

'targetedRec'的推断类型是什么? (您可以通过将鼠标悬停在它上面并查看Intellisense工具提示来判断。)

根据您发布的内容,F#编译器只能将'targetedRec'的类型推断为'a option - 也就是说,编译器知道它是一个选项(因为您已经分配了{{1}到它),但它不能告诉选项的类型参数应该是什么。然后,您在None方法中看到错误,因为编译器无法确定Movex字段属于哪种类型。

这很容易修复 - 只需在y的声明中添加类型注释,就像这样:

targetedRec

仅此一项就可以解决问题,但您可以通过使用模式匹配而不是手动检查let mutable targetedRec : RectangleZ option = None 属性来清除Move方法:

Value