2017-09-24 35 views
0

有沒有可能使用ppx擴展或類似方法將功能更新語法{ record with key = value }與嵌套記錄一起使用的方法?具有嵌套記錄的OCaml功能更新

例如,在下面的示例程序中,我在功能上只更新最外層的記錄,當我真的想要定位一個「內層」記錄時。

type outer = { 
    a : float; 
    b : inner 
} 
and inner = { 
    c : float; 
} 

let item = { a = 0.4; b = { c = 0.7 } } 

let() = ignore { item with b = { c = 0.8 } 

如果inner有多個字段,它變得不太方便。

我希望能夠寫類似以下(稻草人語法):

let() = ignore { item with b.c = 0.8 } 

回答

1

您可以直接OCaml中這樣寫:

{ item with b = { item.b with c = 0.8 } } 

我假設你正在使用ignore只是爲了舉例;忽略功能記錄更新的結果是沒有意義的。

+0

看起來,在某種意義上,答案是「否」。這聽起來像'{record with key = value}'中的'key'只能是單個字段,並且沒有任何常用的擴展名,允許'key'-位置中的更多類型的東西...並可能將其解析爲多個功能更新。 –

+0

是的,直接OCaml的語法在'with'之後要求*字段*。這是一個單一的標識符,可能在包含模塊的名稱之前(其中定義了記錄類型)。 –