Dado que está mezclando operaciones que solo están disponibles en integrales y operaciones que solo están disponibles en fracciones (específicamente usa ^
cuyo segundo operando debe ser integral - use **
si desea que ambos operandos tengan el mismo Tipo flotante), haskell infiere que todos los argumentos y el resultado de taylor3s
tienen el tipo Fractional a, Integral a => a
. Esto no es un error de tipo, ya que teóricamente podría existir un tipo de este tipo, pero lo más probable es que no sea lo que quieres porque en la práctica ese tipo no existe.
La razón por la que se obtiene un error de tipo de todas formas es que el tipo inferido de taylor_results
, en consecuencia, también Fractional a, Integral a => a
que es polimórfico y por lo tanto viola la monomorphism restriction.
Si desea declarar explícitamente taylor_results
como taylor_results :: Fractional a, Integral a => a
o desactivar la restricción monomorphism, todo el asunto sería compilar, pero sea imposible utilizar (sin definir un tipo que realmente crea una instancia integral y fraccional, lo que sería absurdo).
Tenga en cuenta que si se fija este (por ejemplo, mediante la sustitución de
^
con
**
) el tipo de
taylor_results
seguirá siendo polimórficos (se infiere como
taylor_results :: (Floating a, Enum a) => [a]
, que en realidad es sensible), por lo que aún se ejecutará en el monomorphism restricción. Por lo tanto, aún debe desactivar la restricción, declarar explícitamente que el tipo de
taylor_results
es polimórfico o declarar explícitamente que el tipo de
taylor_results
es un tipo específico que crea una instancia flotante y Enum (por ejemplo, doble). Tenga en cuenta que a menos que haga lo último,
taylor_results
se volverá a calcular cada vez que lo use (razón por la cual existe la restricción de monomorfismo).
Tenga en cuenta que si se fija este (por ejemplo, mediante la sustitución de ^
con **
) el tipo más general de taylor_results
será (Floating a, Enum a) => [a]
, sin embargo, el tipo que te dan (a no ser que se desactiva la restricción monomorphism) será [Double]
. Si no desea duplicar, debe declarar explícitamente que taylor_results es de otro tipo (que crea una instancia de Floating y Enum) o que es polimórfico. Tenga en cuenta que si declara que es polimórfico, taylor_results
se volverá a calcular cada vez que lo use (razón por la cual existe la restricción de monomorfismo).
Siempre proporciono tipos explícitos para las funciones de nivel superior. Hace que el código sea más fácil de leer, y cuando sucede algo así, ayuda a reducir el problema y ayuda al compilador a dar mensajes de error significativos.Sin eso, todo lo que sabes es que hay un error de tipo en alguna parte. –
Sí, normalmente lo haría también, pero no tengo ni idea de los tipos numéricos. ¿Quién sabía que podría haber tantos tipos diferentes de números? – mindeavor