F# 对象树语法
F# Object Tree Syntax
在 C# 中,可以用相当简洁的语法构造对象树:
var button = new Button() { Content = "Foo" };
在 F# 中是否有惯用的方法来做类似的事情?
记录的语法很好:
let button = { Content = "Foo" }
据我所知,对象构造似乎是另一回事。通常我会写这样的代码:
let button = new Button()
button.Content <- "Foo"
甚至:
let button =
let x = new Button()
x.Content <- "Foo"
x
解决问题的一种方法是使用自定义的流畅组合运算符:
// Helper that makes fluent-style possible
let inline (.&) (value : 'T) (init: 'T -> unit) : 'T =
init value
value
let button = new Button() .& (fun x -> x.Content <- "Foo")
是否有实现此目的的内置语法或其他推荐方法?
F# 让你 set properties right in the constructor call,所以我认为这应该适合你:
let button = Button(Content = "Foo")
在 C# 中,这种漂亮的语法称为 object initializer,然后可以删除 ()
(1)。要在初始化后更改对象“内联”(流畅风格),我喜欢有一个类似于 .&
运算符的 With()
扩展方法 (2):
var button = new Button { Content = "Foo" }; // (1)
// (2)
public static T With<T>(this T @this, Action<T> update)
{
change(@this);
return @this;
}
var button2 = button.With(x => x.Content = "Bar")
在 F# 中,对于那些喜欢管道而不是运算符的人,可以将函数命名为 tap
(参见 RxJs) or tee
(by Scott Wlaschin here):
// f: ('a -> 'b) -> x: 'a -> 'a
let inline tee f x =
f x |> ignore
x
let button =
Button(Content = "Foo")
|> tee (fun x -> x.Color <- Blue)
|> tee (fun x -> x.Content <- "Bar")
在 C# 中,可以用相当简洁的语法构造对象树:
var button = new Button() { Content = "Foo" };
在 F# 中是否有惯用的方法来做类似的事情?
记录的语法很好:
let button = { Content = "Foo" }
据我所知,对象构造似乎是另一回事。通常我会写这样的代码:
let button = new Button()
button.Content <- "Foo"
甚至:
let button =
let x = new Button()
x.Content <- "Foo"
x
解决问题的一种方法是使用自定义的流畅组合运算符:
// Helper that makes fluent-style possible
let inline (.&) (value : 'T) (init: 'T -> unit) : 'T =
init value
value
let button = new Button() .& (fun x -> x.Content <- "Foo")
是否有实现此目的的内置语法或其他推荐方法?
F# 让你 set properties right in the constructor call,所以我认为这应该适合你:
let button = Button(Content = "Foo")
在 C# 中,这种漂亮的语法称为 object initializer,然后可以删除 ()
(1)。要在初始化后更改对象“内联”(流畅风格),我喜欢有一个类似于 .&
运算符的 With()
扩展方法 (2):
var button = new Button { Content = "Foo" }; // (1)
// (2)
public static T With<T>(this T @this, Action<T> update)
{
change(@this);
return @this;
}
var button2 = button.With(x => x.Content = "Bar")
在 F# 中,对于那些喜欢管道而不是运算符的人,可以将函数命名为 tap
(参见 RxJs) or tee
(by Scott Wlaschin here):
// f: ('a -> 'b) -> x: 'a -> 'a
let inline tee f x =
f x |> ignore
x
let button =
Button(Content = "Foo")
|> tee (fun x -> x.Color <- Blue)
|> tee (fun x -> x.Content <- "Bar")