たとえば C++ のクロージャは型名を指定できないので、 auto で雑に受けるか std::function で受けるわけですが、前者では関数であると縛りをつけられないし、後者だと実行時オーバーヘッドがあります。
Rust で同じことをすると let による型指定なしの束縛と Box<dyn Fn()> などが相当するわけですが、これ以外にも impl Fn() という指定もできます。
たとえばクロージャを返す
fn f() -> impl Fn() {
|| println!("hello")
}
は、「何度でも呼べる関数として振る舞う何かを返す」ということは述べるけど、 std::function のようなオーバーヘッドはない (わざと付けることもできるけど)
典型的には「この関数は i64 のイテレータであるような何らかの型を返すことは保証するけど、それが具体的にどのような型であるかは教えたくないよ (i64 のイテレータであること以外の一切の保証を与えたくないよ)」というケースなどで有用。ある種のカプセル化、内部表現の隠蔽ですね
これ読みながら思ったのは、C# Delphi(?)/Java(?)で言う所のInterface・・・?><(ぜんぜん違う?><;)
型システムの理論からみるSwiftの存在型(Existential Type) - Qiita https://qiita.com/ukitaka/items/a993b5d7ed5ae84b1b52
そういえば最近気づいたけど、これDelphiっぽさ><
WebRequest.Create Method (System.Net) | Microsoft Docs https://docs.microsoft.com/en-us/dotnet/api/system.net.webrequest.create?view=netframework-4.7.2