Esperaba que el siguiente código fallara con un error de tipo debido a la violación de minBound y maxBound. Pero, como puede ver, se procesa sin marcar un error.¿Cómo se usa la clase de tipo delimitada en Haskell para definir un tipo con un rango de coma flotante?
{-# OPTIONS_GHC -XTypeSynonymInstances #-}
module Main where
type Probability = Float
instance Bounded Probability where
minBound = 0.0
maxBound = 1.0
testout :: Float -> Probability
testout xx = xx + 1.0
main = do
putStrLn $ show $ testout 0.5
putStrLn $ show $ testout (-1.5)
putStrLn $ show $ testout 1.5
en el preludio recibí este
*Main> :type (testout 0.5)
(testout 0.5) :: Probability
Y en el indicador me sale esto:
[~/test]$runhaskell demo.hs
1.5
-0.5
2.5
Claramente no estoy declarando acotada correctamente, y estoy seguro de que Estoy haciendo algo mal sintácticamente. No hay muchas cosas simples en Google sobre clases de tipos limitadas, por lo que cualquier ayuda sería muy apreciada.
Muy útil, muchas gracias. Una pregunta: pones una elipsis ("...") para definir las diversas formas en que mkP y mkBC interactúan con operadores existentes en cosas de tipo Num. Supongo que el propósito de eso es definir operadores aritméticos para cosas del tipo de probabilidad que siguen ejecutando el resultado a través de mkP para hacer la comprobación de límites. – ramanujan
@ramanujan, sí. Básicamente solo continúa en ese patrón. – luqui
En caso de que no sepa dónde buscar los métodos 'Num': http://hackage.haskell.org/packages/archive/base/4.2.0.2/doc/html/Prelude.html#t%3ANum – luqui