División segura
Definir la función
1 |
divisionSegura :: Double -> Double -> Double |
tal que (divisionSegura x y)
es x/y
si y no es cero y 9999
en caso contrario. Por ejemplo,
1 2 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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
1 |
if <condición> then <valor1> else <valor2> |
y en Python como
1 2 3 |
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
.