我有代码可以在图元之间实现一些几何运算
type point = double * double
type shape =
| Point of point
| Line of point * point
| Vector of point
| Circle of point * double
with
member this.ToString = function
| Point (x,y) -> sprintf "(%f; %f)" x y
| Vector (x,y) -> sprintf "(%f; %f)" x y
| Line ((x0,y0),(x1,y1)) -> sprintf "(%f; %f)->(%f; %f)" x0 y0 x1 y1
| Circle ((x0,y0),radius) -> sprintf "(%f; %f)r%f" x0 y0 radius
let inline (-) (Point (x0,y0)) (Point (x1,y1)) = Vector (x0-x1,y0-y1)
let inline (+) (Point (x0,y0)) (Vector (x1,y1)) = Point (x0+x1,y0+y1)
并且编译器说运算符的模式匹配并不详尽,尽管这只是一个警告。如何在没有编译器提示的情况下仅在 DU 的特定子类型之间正确实现运算符?
最佳答案
运算符通常定义为静态成员:
type shape =
...
static member (-) (x, y) =
match x, y with
| Point (x0,y0), Point (x1,y1) -> Vector (x0-x1,y0-y1)
| Point (x0,y0), Vector (x1,y1) -> Point (x0+x1,y0+y1)
| _ -> failwith "invalid arguments"
关于您的尝试的几点说明:
- 联合案例不是类型,因此不能用于定义方法重载
- 函数不能重载
关于f# - 如何在 f# 中为可区分联合定义运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17053368/