KeyExistsQ []하지만 함수를 위해?
Aug 21 2020
예 를 들어 연결 과 유사한 함수 f[5]
인지 여부를 확인하는 좋은 방법이 있습니까? 할당이 지연되었지만 특히 값이 할당되지 않은 경우 false를 반환하고 싶습니다 .f
KeyExistsQ[f,5]
f[x_]
f[5]
f[x_] := f[x] = x^2
KeyExistsForFunctionsQ[f,5]
f[5];
KeyExistsForFunctionsQ[f,5]
(*False, True*)
답변
9 SjoerdSmit Aug 21 2020 at 22:41
다음은 함수의 아래쪽 값이 f[5]
문자 그대로 일치하는지 확인하는 간단한 방법입니다 . 다음에 대한 좋은 사용 사례입니다 Verbatim
.
KeyExistsForFunctionsQ[fun_, arg_] := AnyTrue[
Keys[DownValues[fun]],
MatchQ[#, Verbatim[HoldPattern[fun[arg]]]] &
]
이 방법은 함수의 다른 유형의 다운 값을 확인하는 데에도 확장 될 수 있습니다. 예를 들면 :
ValueQWithoutEval[fun_, arg_] := AnyTrue[
Keys[DownValues[fun]],
MatchQ[Hold[fun[arg]], Hold[#]] &
]
이것은 fun[arg]
실제로 평가를 시도하지 않고 (예를 들어 비용이 많이들 수 있기 때문에) 함수의 다운 값이 일치하는지 확인합니다 . 다음 과 같은 Condition
rhs에서 사용하는 할당에는 작동하지 않습니다.:=
f[x_] := With[{y = 2 x + 1}, y /; PrimeQ[y]]
이와 같은 함수의 경우 인수가 일치하는지 확인하기 위해 함수를 적어도 부분적으로 평가하는 것을 피할 수 없습니다.
9 JasonB. Aug 21 2020 at 21:49
DownValues
이전에 계산 된 결과를 캐싱하는 유일한 방법은 아닙니다. 예를 들어 연결을 사용할 수 있습니다.
ClearAll[fdata, f]
fdata = <||>;
f[x_] := Lookup[fdata, x, fdata[x] = x^2]
이제 값을 계산하면에 저장됩니다 fdata
.
In[21]:= f /@ Range[3]
Out[21]= {1, 4, 9}
In[22]:= KeyExistsQ[fdata, #] & /@ Range[4]
Out[22]= {True, True, True, False}
kglr Sep 29 2020 at 05:57
ClearAll[keyExistsQ]
keyExistsQ = Function[{func, arg},
KeyExistsQ[DownValues[func], HoldPattern[func[arg]]], HoldAll];
예:
ClearAll[f]
f[x_] := f[x] = x^2
{keyExistsQ[f, 5], f[5], keyExistsQ[f, 5]}
{False, 25, True}