Ho creato un algoritmo che accetta un valore Int non negativo, che rappresenta un numero totale di minuti, e restituisce una tripla che fornisce (giorni, ore, minuti) a cui questo corrisponde.Haskell - Modo più efficiente per completare l'algoritmo?
Ecco il mio codice:
calcdays :: Int -> Int
calcdays x = x `div` (24*60)
calchours :: Int -> Int
calchours x = (x - ((calcdays x)*24*60)) `div` 60
calcmins :: Int -> Int
calcmins x = (x - ((calcdays x)*24*60) - ((calchours x)*60))
dayshoursmins :: Int -> (Int,Int,Int)
dayshoursmins x = (calcdays x, calchours x, calcmins x)
Usando solo operazioni di base Haskell (guardie, div, mods, ecc), c'è un modo più semplice di programmazione di questa funzione?
EDIT:
ho usato un suggerimento di seguito per rendere questo codice più semplice, mentre non è così semplice come la soluzione qoutRem, ho pensato che avrei potuto pubblicarlo:
calcdays :: Int -> Int
calcdays x = x `div` (24*60)
calchours :: Int -> Int
calchours x = (x `mod` (24*60)) `div` 60
calcmins :: Int -> Int
calcmins x = (x `mod` (24*60)) `mod` 60
dayshoursmins :: Int -> (Int,Int,Int)
dayshoursmins x = (calcdays x, calchours x, calcmins x)
non parlo Haskell ma l'algoritmo va normalmente in questo modo: 'prendere l'input, dividerlo per 60, il resto è la parte minuto, il risultato è quindi diviso per 24, il resto è la parte delle ore, il risultato è la parte dei giorni'. Quindi avresti bisogno di concatenare i calcoli piuttosto che eseguirli in isolamento. – biziclop
Sì, tuttavia, in Haskell, non è possibile impostare variabili, quindi non sono sicuro su come ottenere ciò. –
Non è necessario impostare le variabili, è sufficiente inserire immediatamente il risultato nel passaggio successivo. Comunque non sono sicuro della sintassi. – biziclop