Birisi bu F # merakını açıklayabilir mi?Arabirimlerdeki akıcı argümanlar
type IFoo =
abstract member Bar1: int * int -> int * int
abstract member Bar2: int * int -> (int * int)
abstract member Bar3: (int * int) -> int * int
type Foo() = class end
with
interface IFoo with
member this.Bar1 (x, y) = (x, y)
member this.Bar2 (x, y) = (x, y) // Same impl as Bar1 i.e. parentheses on RHS of -> in interface member definition are ignored
// member this.Bar3 (x, y) = (x, y) // Compile error: "This override takes a different number of arguments to the corresponding abstract member"
member this.Bar3 tuple = tuple // So, parentheses on LHS of -> in interface member definition *does* make a difference!
IFoo.Bar1
ve IFoo.Bar3
tanımları arasındaki anlam farkı nedir? bir demet veya CLI yönteminin argüman listesi:
İlginç - CLI ayrıntıları F # sözdizimine sızıyor. Sanırım bu, ortak nedenlerden dolayı gerekli mi? Saf F # kodu için, iki durumu ayırt etmek için herhangi bir sebep göremiyorum. – Akash
@Akash Neden olursa olsun, CLI yöntemlerinin dünyası çok paradigma dili olarak F # nin bir parçası haline gelmiştir. Aşırı yüklenme, kalıtım ve geçersiz kılma, isteğe bağlı argümanlar ve benzerleri vardır ve bu özellikler null'un olduğu gibi interop olarak ayrılmaz. Ancak, her zaman işlevsel ilk programlama ile iyi birleştirmezler. Saf fonksiyonel kodda, bu özellikler kullanılmaz, dolayısıyla işlevsel kısım CLI yöntemlerine iyi eşleşir - sorunuzda gösterilen nadiren gariplik dışında. – Vandroiy