División segura
Definir la función
divisionSegura :: Double -> Double -> Double
tal que (divisionSegura x y)
es x/y
si y no es cero y 9999
en caso contrario. Por ejemplo,
divisionSegura 7 2 == 3.5 divisionSegura 7 0 == 9999.0
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
Soluciones en Haskell
import Test.QuickCheck -- 1ª definición divisionSegura1 :: Double -> Double -> Double divisionSegura1 x y = if y == 0 then 9999 else x/y -- 2ª definición divisionSegura2 :: Double -> Double -> Double divisionSegura2 _ 0 = 9999 divisionSegura2 x y = x/y -- Comprobación de equivalencia -- ============================ -- La propiedad es prop_divisionSegura :: Double -> Double -> Bool prop_divisionSegura x y = divisionSegura1 x y == divisionSegura2 x y -- La comprobación es -- λ> quickCheck prop_divisionSegura -- +++ OK, passed 100 tests.
El código se encuentra en GitHub.
Soluciones en Python
from hypothesis import given, strategies as st # 1ª definición def divisionSegura1(x: float, y: float) -> float: if y == 0: return 9999.0 return x/y # 2ª definición def divisionSegura2(x: float, y: float) -> float: match y: case 0: return 9999.0 case _: return x/y # La propiedad de equivalencia es @given(st.floats(allow_nan=False, allow_infinity=False), st.floats(allow_nan=False, allow_infinity=False)) def test_equiv_divisionSegura(x, y): assert divisionSegura1(x, y) == divisionSegura2(x, y) # La comprobación es # src> poetry run pytest -q division_segura.py # 1 passed in 0.37s
El código se encuentra en GitHub.
Comentarios
- El condicional se escribe en Haskell como
if <condición> then <valor1> else <valor2>
y en Python como
if <condición>: return <valor1> return <valor2>
- Una alternativa al uso de los condicionales son los patrones que en Haskell se escribe en los argumentos de las ecuaciones y en Python con
match cases
.