¿Cómo sería una función FunctionQ
, tal vez de una manera que incluso puedo especificar la cantidad de argumentos permitidos?¿Prueba si una expresión es una función?
Respuesta
Realmente me siento mal posteando después de Simon y Daniel, pero sus códigos fallan en funciones que no son símbolos. La comprobación de que y la adición de un cheque por órdenes internas a través de NumericFunction
, según lo sugerido por Simon, se llega a algo así como
FunctionQ[_Function | _InterpolatingFunction | _CompiledFunction] = True;
FunctionQ[f_Symbol] := Or[
DownValues[f] =!= {},
MemberQ[ Attributes[f], NumericFunction ]]
FunctionQ[_] = False;
que debería funcionar en algunos casos de la vida real (suspiro)
In[17]:=
FunctionQ/@{Sin,Function[x,3x], Compile[x,3 x],Interpolation[Range[5]],FunctionQ,3x,"a string", 5}
Out[17]= {True,True,True,True,True,False,False,False}
Si Conozco la firma de la función que está buscando (es decir, cuántos argumentos y de qué tipo), estoy de acuerdo con Simon en que el camino a seguir es tipar pato: Apply
la función a argumentos típicos, y buscar resultados válidos. El almacenamiento en caché puede valer la pena:
AlternativeFunctionQ[f_]:=AlternativeFunctionQ[f]=
With[{TypicalArgs={1.0}},NumericQ[Apply[f,TypicalArgs]]];
In[33]= AlternativeFunctionQ/@{Sin,Function[x,3x], Compile[x, 3x],Interpolation[Range[5]],FunctionQ,3x,"a string", 5}
Out[34]= {True,True,True,True,False,False,False,False}
¡Definitivamente no te sientas mal! Ese es el MO de SO: construir uno sobre el otro para llegar a la mejor respuesta posible. Gran trabajo en esto, por cierto! – dreeves
Estaba revisando esto otra vez, y noté que 'FunctionQ' no es una función de var por' AlternativeFunctionQ'. Entonces, si bien es efectivo para encontrar funciones numéricas, no puede encontrar otros tipos. – rcollyer
@rcollyer: El 'AlternativeFunctionQ' se entiende como un ejemplo: los argumentos típicos, así como el resultado válido deben adaptarse al caso en cuestión. Supongo que esto no es muy elegante desde el punto de vista de la arquitectura, pero a menudo encaja bastante bien. – Janus
Aquí es algo rápido y sucio que puede hacer lo que se necesita:
FunctionQ[x_] := Head[x] == Function || DownValues[x] =!= {}
¡Gracias! Intento el lunes y acepto tu respuesta, entonces ... –
Como dijo Daniel, su prueba (que probablemente debería leer)
FunctionQ[x_] := Head[x] === Function || DownValues[x] =!= {}
Es rápido y sucio. Fallará para las funciones integradas, p. FunctionQ[Sin]
devolverá False (Muchas funciones integradas se detectarán al buscar Attribute
NumericFunction
). También fallará para cosas como f[x_][y_]
etc ... Probablemente también debería probar UpValues
, SubValues
y quizás NValues
(ver here por sus significados).
Este problema fue discutido en thread. Hay muchas ideas útiles en este hilo, por ejemplo, maneras de encontrar el número de argumentos que pueden tomar algunas funciones, pero no se llegó a un consenso real en la discusión.
Creo que el mejor enfoque es un tipo de duck typing. Probablemente sepa cuántos y qué tipo de argumentos quiere que su función tome, así que pruébelo con ValueQ. Luego asegúrese de detectar los errores usando Check.
EDITAR: Otro comp.soft-sys.math.mathematica thread.
- 1. Python: prueba si el objeto es una función incorporada
- 2. Prueba de capibara si la página tiene una expresión regular
- 3. ¿Prueba si un método es una anulación?
- 4. Prueba si una variable es serializable
- 5. Función para verificar si una cadena es una fecha
- 6. Comprobando si el valor es una función
- 7. Prueba si una cadena de python es imprimible
- 8. Todo es una expresión
- 9. cómo saber si una variable de JavaScript es una función
- 10. php is_function() para determinar si una variable es una función
- 11. Pruebe si una expresión regular es válida en PHP
- 12. prueba una expresión booleana en una cadena de Python
- 13. Función que devuelve una expresión lambda
- 14. Prueba Si una propiedad no es nulo antes de regresar
- 15. ¿Por qué es determinante si una función es puramente difícil?
- 16. ¿Cuál es la diferencia entre Test t; y Prueba t() ;? Si la prueba es una clase
- 17. Comprueba si una expresión regular cubre otra expresión regular
- 18. ¿Puedo invocar una función en una expresión lambda?
- 19. Pruebe si se llama a una función en una prueba de la unidad Ruby on Rails
- 20. prueba si se define una propiedad MSBuild?
- 21. JS prueba si es múltiplo de 10
- 22. Escribir una función que acepta una expresión lambda como argumento
- 23. Monkey-patch una función integrada para una prueba unitaria?
- 24. Prueba si un objeto implementa una interfaz
- 25. ¿Prueba si una clase tiene un atributo?
- 26. NSubstitute - Prueba para una expresión de linq específica
- 27. En C++, ¿es una función automáticamente virtual si anula una función virtual?
- 28. ¿Es posible parametrizar una prueba de nunit?
- 29. ¿Expresión regular para encontrar una expresión regular?
- 30. ¿Cómo determinar si la variable es una función en Python?
No entiendo muy bien su pregunta. ¿Quiere decir que quiere escribir una función FunctionQ [input_] que devuelve True si la entrada es una función, de lo contrario es falso? ¿Qué forma toma la entrada? –
@Mark: la primera pregunta que respondería con Sí. La forma que la entrada tomaría es una expresión de Mathematica ... –