KVB의 변화가 유사한 패턴을 생성하기 위해 수정 될 수있다 : 그러나
let (|Value|_|) x value =
match box value with
| :? 'T as y when x = y -> Some()
| _ -> None
을, 미묘한 성능 차이가있다 . 원래 활성 패턴은 다음과 같이 변환됩니다.
public static FSharpOption<T> |Value|_|<a, T>(a value)
{
object obj = value;
if (!LanguagePrimitives.IntrinsicFunctions.TypeTestGeneric<T>(obj))
{
return null;
}
return FSharpOption<T>.Some((T)((object)obj));
}
즉, 유형 테스트 및 캐스트입니다. 이 변환에 사용 (match x with Value "" -> ...
)이다 :
FSharpOption<string> fSharpOption = MyModule.|Value|_|<object, string>(obj);
if (fSharpOption != null && string.Equals(fSharpOption.Value, ""))
{
...
}
가장 두드러진 패턴에서 반환 된 값이 입력 패턴 전형적인 컴파일러 변형 (문자열 string.Equals
)를 사용하여 일치된다. 일반 어떤지를 사용하고 문자에 대해 매칭보다 효율적
public static FSharpOption<Unit> |Value|_|<T, a>(T x, a value)
{
object obj = value;
if (LanguagePrimitives.IntrinsicFunctions.TypeTestGeneric<T>(obj))
{
T y = (T)((object)obj);
T y3 = y;
if (LanguagePrimitives.HashCompare.GenericEqualityIntrinsic<T>(x, y3))
{
T y2 = (T)((object)obj);
return FSharpOption<Unit>.Some(null);
}
}
return null;
}
:
업데이트 된 패턴으로 변환한다. 평등이 패턴으로 구워지기 때문에 사용법은 조금 더 간단합니다.
FSharpOption<Unit> fSharpOption = MyModule.|Value|_|<string, object>("", obj);
if (fSharpOption != null)
{
...
}
어쨌든 작동합니다. 그러나 나는 원래의 것이 더 좋다.
이 작동하지만 중첩 패턴을 사용할 수 없습니다 (매개 변수가있는 활성 패턴의 매개 변수가 일치하는 패턴이 아닌 expression으로 평가되므로). –
오른쪽. 그것이 다른 평등 의미론의 근본 원인이지만 더 간결하게 설명합니다. – Daniel