在F#中将一个对象映射/转换为另一个对象



我是F#的初学者,一直在玩,直到遇到这个问题。我找了一下,但什么也找不到。我想把一个物体变成另一个。我有一个地理定位对象,它有很多属性,其中两个属性是纬度和经度我想创建一个新的动态对象,但使用管道或选择运算符,只使用属性的子集

let customLocation = OtherPlace.Geolocation ....

我该怎么做?

解决这类问题的最佳方法是用单个事例创建一个有区别的并集。您可以使用一个直接的类型别名,但会丢失少量的类型安全性。要定义类型,请使用:

type Loc = |LL of float * float

然后你可以创建一些实例,比如:

Something |> fun t -> LL(t.Latitude,t.Longitude)

或者更简单的版本:

LL(something.Latitude,something.Longitude)

假设您有一个OtherPlace.Geolocation 数组

geoLocations :  OtherPlace.Geolocation array

然后你可以,根据你的需要:

  • 使用元组(这只是记录的特殊情况)

 //of type (double * double) array
let g = geoLocations |> Array.map (fun x -> x.Latitude, x.Longitude)  
  • 创建一个记录类型(注:元组只是一个具有位置名称的记录)

type Position = {Latitude : double; Longitude : double}
//of type Position array
let g = geoLocations |> Array.map (fun x -> x.Latitude, x.Longitude) 

对于较小的本地需求,元组更适合,但可能会变得难以处理。

记录使您能够更好地构建程序


并集格应该用来区分不同的事物,这些事物仍然代表着一些共同的概念。例如,您可以在不同的系统中表达位置

type GeoPosition = | LaTLong of double * double
                   | WGS84 of double * double
                   | ...
//of type GeoPosition array
let g = geoLocations |> Array.map (fun x -> LatLong (x.Latitude, x.Longitude))  

PS:如果你使用F#3.1,你有一个额外的糖来命名联合类型字段,如这里所示

最新更新