Estoy tratando de ampliar mi mente aprendiendo Haskell.¿Cómo funciona Type Deduction en Haskell?
mi tarea autoinfligidas era construir un generador de reloj-tick, que me daría intervalos de distribución de Poisson, y el resultado final (después de una larga lucha, lo admito) fue la siguiente:
import System.Random
poissonStream :: (Ord r, Random r, Floating r, RandomGen g) => r -> r -> r -> g -> [r]
poissonStream rate start limit gen
| next > limit = []
| otherwise = next:(poissonStream rate next limit newGen)
where (rvalue, newGen) = random gen
next = start - log(rvalue)/rate
Pero Hay dos cosas (al menos) que no entiendo:
¿Por qué necesito "Ord r
" y "Floating r
"? (Hubiera esperado algún tipo de herencia automática: "Flotante" implica "Ord").
¿Por qué ruta se obtiene la definición de tipo implícita "rvalue :: Float
"? En GHCi consigo lo que habría esperado:
*Main System.Random> let (rvalue, newGen) = random (mkStdGen 100)
<interactive>:1:23:
Ambiguous type variable `t' in the constraint:
`Random t' arising from a use of `random' at <interactive>:1:23-43
Probable fix: add a type signature that fixes these type variable(s)
rvalue es un cañón suelto que tengo que atar:
*Main System.Random> let (rvalue, newGen) = random (mkStdGen 100) :: (Float, StdGen)
*Main System.Random> rvalue
0.18520793
favor ser suave con un n00b Haskell.
En mi humilde opinión, si esto solo es autoaprendizaje, no lo etiquetaría como tarea. Las preguntas sobre la tarea implican un problema altamente artificial y, en general, cambiarán el tipo de respuesta que obtenga (más que una sugerencia que la de presentarla), a menos que eso sea lo que usted prefiera. – cletus
@cletus: Gracias por la observación. Pensé que era mejor señalar esto como un ejercicio, en lugar de un problema del mundo real, desde el principio. –
Lo etiquetaría como "hobby" o "autoaprendizaje" en lugar de "tarea". La "tarea" no implica "no el mundo real" sino "realmente no me da una respuesta". – Chuck