Tema

Como se saca la parte entera en funcional?

14 respuestas 17461 visitas

Como se saca la parte entera en funcional?

por ejemplo... en una funcion q recibe parametros de tipo Integer
quiero usar la parte entera de la raiz de un numero... como lo escribo?

Firma

111dz1.gif

floor n 😄

Firma

Hay 10 tipos de personas en el mundo. Los que entienden binario, y los que no...

Hugs> takeWhile (/= '.') (show 423.1234)
"423"

😄

gracias 🙂

jajaja
nos dejaran usar algo como lo q puso eivanec?
(es un lambda abstraction lo q hiciste con el igual o mande fruta?)

jajaja si, es una lambda-abstraction parece, pero el takewhile es medio ilegal aca me parece XD

No, creo que no; takeWhile toma una función que devuelve Bool y una lista:

Hugs> :t takeWhile
takeWhile :: (a -> Bool) -> [a] -> [a]

Y /=, el "operador" de desigualdad, es por supuesto simplemente una función:

Hugs> :t (/=)
(/=) :: Eq a => a -> a -> Bool

Que no cumple el tipo requerido, pero agregando su primer parámetro...

Hugs> :t (/= '.')
flip (/=) '.' :: Char -> Bool

La reducción da bien. Magias de haskell, jaja. Por cierto lo que posteé es una gran mentira, por supuesto, ya que devuelve chars:

Hugs> :t (takeWhile (/= '.') (show 423.1234))
takeWhile (flip (/=) '.') (show 423.1234) :: Fractional a => [Char]

Creo que el lambda en Haskell es siempre , pero no me consta.

Saludos!

La parte entera se puede sacar usando floor, que creo q es totalmente legal usarla

Ejemplo:

floor 1.75

devuelve:
1

Firma

"If debugging is the process of removing bugs, then programming must be the process of putting them in." -- Dijkstra

Sí, esa fue la primera respuesta y la correcta! El resto fue un off-topic por aburrimiento y densidad mía, jaja. Saludos.

jaja, con tanto post me olvidé de que ya habían dicho esa respuesta, perdón por repetir y no leer! 😛

tengo una solucion alternativa... que esta buena cuando uno quiere hacer la funcion, y no utilizar las que vienen en el prelude....

parteentera :: Double -> Integer
parteentera n | n <= -1 = (-1) * laparteentera 0 (-n)
parteentera n | -1 < n && n < 1 = 0
parteentera n | n >= 1 = laparteentera 0 n

laparteentera :: Integer -> Double -> Integer
laparteentera x n | 0 > n = x-1
laparteentera x n | otherwise = laparteentera (x+1) (n-1)

obvio que es una forma... debe haber miles... y seguramente esta forma puede quedar mejor escrita... pero la idea está.... agarro un float, y le voy restando de a uno hasta que me de negativo... cuando llego a que me de negativo, devuelvo la cantidad de veces que le reste uno y listo....

espero que sirva de algo...

Solo para completar la idea de eivanec (y para enojar a dani q no le gusta q use cosas consideradas ilegales en la materia) :

entera :: Fractional a =&gt; a -&gt; Integer
entera = read . takeWhile (/= '.') . show 

Agarra un Float o Double y lo transforma a [Char] con el "show", desp le saca hasta el '.' y lo transforma de vuelta a Int con el "read".. el '.' es composicion de funciones

Siguiendo la misma idea, se puede sacar facil el reverso de un Integer:

reversoInt :: Integer -&gt; Integer
reversoInt = read . reverse . show 

Main> reversoInt 123456789
987654321

Nico? escribió:

Agarra un Float o Double y lo transforma a [Char] con el "show", desp le saca hasta el '.' y lo transforma de vuelta a Int con el "read".. el '.' es composicion de funciones

... las cosas q se ven acá.... xD

Sin duda burdo lo mío, no lo niego 😄

Editado 1 vez.

Perdón, no lo dije con el sentido de discriminar. Mejor lo edito así evitamos problemas.
Gracias por avisar!