Bunun için doğrudan bir destek olduğunu sanmıyorum, ancak kesinlikle etkin model yazabilirsiniz. Aktif kalıplar, desen eşlemesinin bir parçası olarak çalışacak kendi kodunuzu uygulamanıza olanak tanır ve & değerini değerin bir kısmını geri getirebilirsiniz.
Aşağıda, iki parametre (önek ve postfix dizesi) alan ve belirtilen giriş belirtilen dizelerle başlayıp bitip bitmediğinde başarılı olan bir kalıptır. desen (başarısız olabilir) tam değildir, bu yüzden |Name|_|
sözdizimi kullanacağız ve opsiyon değeri döndürmek gerekir:
let (|Middle|_|) prefix postfix (input:string) =
// Check if the string starts with 'prefix', ends with 'postfix' and
// is longer than the two (meaning that it contains some middle part)
if input.StartsWith(prefix) && input.EndsWith(postfix) &&
input.Length >= (prefix.Length + postfix.Length) then
// Strip the prefix/postfix and return 'Some' to indicate success
let len = input.Length - prefix.Length - postfix.Length
Some(input.Substring(prefix.Length, len))
else None // Return 'None' - string doesn't match the pattern
Şimdi eşleşen desende Middle
kullanabilirsiniz (örn match
kullanılırken):
match "[aaa]" with
| Middle "[" "]" mid -> mid
| all -> all
(http://stackoverflow.com/questions/3722591/pattern-matching-on-the-beginning- adresindeki alıntı metninin ilk örneği of-a-string-in-f – Brian