Estoy jugando con el principiante Haskell, y quería escribir una función promedio. Parecía la cosa más simple del mundo, ¿verdad?tipos de Haskell frustrando una simple función 'promedio'
Wrong.
Parece que el sistema de tipos de Haskell prohíbe que el promedio trabaje en un tipo numérico genérico: puedo hacer que funcione en una lista de integrales, o una lista de fraccionales, pero no en ambos.
Quiero:
average :: (Num a, Fractional b) => [a] -> b
average xs = ...
Pero sólo se puede obtener:
averageInt :: (Integral a, Fractional b) => [a] -> b
averageInt xs = fromIntegral (sum xs)/fromIntegral (length xs)
o
averageFrac :: (Fractional a) => [a] -> a
averageFrac xs = sum xs/fromIntegral (length xs)
y la segunda parece funcionar. Hasta que intente pasar una variable.
*Main> averageFrac [1,2,3]
2.0
*Main> let x = [1,2,3]
*Main> :t x
x :: [Integer]
*Main> averageFrac x
<interactive>:1:0:
No instance for (Fractional Integer)
arising from a use of `averageFrac ' at <interactive>:1:0-8
Possible fix: add an instance declaration for (Fractional Integer)
In the expression: average x
In the definition of `it': it = averageFrac x
Aparentemente, Haskell es muy exigente con sus tipos. Eso tiene sentido. Pero no cuando ambos podían ser [Num]
¿Me falta una aplicación obvia de RealFrac?
¿Hay alguna forma de forzar integrales en fracciones que no se ahogan cuando recibe una entrada fraccional?
¿Hay alguna manera de usar Either
y either
para hacer algún tipo de función promedio polimórfica que funcione en cualquier tipo de matriz numérica?
¿El sistema de tipo Haskell prohíbe abiertamente que esta función exista?
Aprender Haskell es como aprender Cálculo. Es realmente complicado y se basa en montañas de teoría, y algunas veces el problema es tan complejo que ni siquiera sé lo suficiente como para formular la pregunta correctamente, por lo que cualquier idea será cálidamente aceptada.
(También, nota al pie: esto se basa en un problema de tarea. Todos están de acuerdo en que el promedio de Frac, arriba, obtiene puntos completos, pero sospecho que hay una manera de hacerlo funcionar en arreglos integrales y fraccionarios)
http: // stackoverflow.com/questions/1816993/haskell-dividing-num –