आप इस का उपयोग कर निर्मित क्षमताओं का समाधान कर सकते हैं: Option.bind
type A =
member this.X : B option = Unchecked.defaultof<_>
and B =
member this.Y : С option = Unchecked.defaultof<_>
and С =
member this.Z : string option = Unchecked.defaultof<_>
let a : A = Unchecked.defaultof<_>
let v =
match
a.X
|> Option.bind (fun v -> v.Y)
|> Option.bind (fun v -> v.Z) with
| Some s -> s
| None -> "<none>"
सच कहूं, मुझे शक है कि पूर्ण विकसित 'हो सकता है' कार्यान्वयन शुरू करने (संगणना भाव के माध्यम से) यहाँ छोटा कर सकते हैं कोड।
संपादित: सपना मोड - पर
मुझे लगता है कि Option.bind संस्करण के साथ करता है, तो एफ # विशेष मामले के लिए और अधिक हल्के वाक्यविन्यास है छोटा बनाया जा सकता है: लैम्ब्डा है कि इसके तर्क के कुछ सदस्य को देखें :
"123" |> fun s -> s.Length // current version
"123" |> #.Length // hypothetical syntax
यह कैसे नमूना पहले से ही इस तरह के क्षमता है कि Nemerle में फिर से लिखा जा सकता है:
using System;
using Nemerle.Utility; // for Accessor macro : generates property for given field
variant Option[T]
{
| Some {value : T}
| None
}
module OptionExtensions
{
public Bind[T, U](this o : Option[T], f : T -> Option[U]) : Option[U]
{
match(o)
{
| Option.Some(value) => f(value)
| Option.None => Option.None()
}
}
}
[Record] // Record macro: checks existing fields and creates constructor for its initialization
class A
{
[Accessor]
value : Option[A];
}
def print(_)
{
// shortened syntax for functions with body -> match over arguments
| Option.Some(_) => Console.WriteLine("value");
| Option.None => Console.WriteLine("none");
}
def x = A(Option.Some(A(Option.Some(A(Option.None())))));
print(x.Value.Bind(_.Value)); // "value"
print(x.Value.Bind(_.Value).Bind(_.Value)); // "none"
मुझे उत्सुकता है कि यदि आप मिलान प्रकार विभिन्न प्रकारों पर संचालित होते हैं, उदाहरण के लिए बाहरी विकल्प और आंतरिक सूची ... संपूर्ण अभिव्यक्ति अभी भी एक विकल्प लौट रही है। – Daniel
क्या आप काल्पनिक नमूना दे सकते हैं: स्रोत कोड और परिणामस्वरूप आप क्या प्राप्त करना चाहते हैं? – desco