es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema con la función comp en Clojure

Tengo 3 archivos anteriores con una función cada uno y estoy tratando de usar “comp” en ex4.clj para combinar los 3, pero actualmente estoy obteniendo un error sobre el número incorrecto de argumentos que se están pasando. He intentado usar map, reduce y filter con él, pero todos fallan y no estoy seguro de cómo determinar cuál sería el deseado, ya que todas las funciones usan uno diferente.

ex1.clj

(defn round [input] (Math/round (double input)))

(def testList [4.7 3.3 -17 17 -5.6 -3.3 0])

(def roundedList (map round testList))

ex2.clj

(defn isDivisibleBy [factor]
    (fn [number]
        (def result (/ number factor))
        (def roundedResult (Math/round (double result)))

        (and (= result roundedResult))
    )
)

(def divisibleBy2 (isDivisibleBy 2))

(def testList [2 3 4 17 3000 -3 -6 0])

(def divisibleSuccess (filter divisibleBy2 testList))

ex3.clj

(defn findMax [accum value]
    (if (> accum value) accum value)
)

(def testList [2 3 4 17 3000 -3 0 -3001])
(def maxValue (reduce findMax testList))

ex4.clj (Archivo con problema)

(load-file "ex1.clj")
(load-file "ex2.clj")
(load-file "ex3.clj")

(def testList [4.7 3.3 -17 17 -5.6 -3.3 0])
(def allThree (comp findMax divisibleBy2 round))
(def output ((map/reduce/filter) allThree testList))

(println "Lista original: " testList)
(println "Número más alto redondeado divisible por 2: " output)

¡Gracias!

Tags:  

Answer

  1. Avatar for davy.ai

    El problema con el código en ex4.clj es el uso de “map/reduce/filter” en la definición de “output”. Esta sintaxis de combinación de funciones es incorrecta y está causando el error de “número incorrecto de argumentos”.

    En lugar de usar “map/reduce/filter”, la forma correcta de aplicar una función combinada es envolverla entre paréntesis y pasarle el valor de entrada. Entonces, en este caso, la definición de “output” debería ser:

    (def output (allThree testList))
    

    Esto aplicará las funciones “round”, “divisibleBy2” y “findMax” en el orden especificado por la función “comp” al valor de entrada “testList” y devolverá el resultado final.

    Además, parece que la definición de “divisibleSuccess” de ex2.clj no se está utilizando en ex4.clj. Si el objetivo es encontrar el número redondeado más alto divisible por 2 de “testList”, la combinación de funciones correcta sería:

    (def allThree (comp findMax divisibleSuccess round))
    

    Esto primero filtrará “testList” para que solo contenga valores divisibles por 2, luego encontrará el valor máximo de la lista filtrada y finalmente lo redondeará.

    Por lo tanto, el código final en ex4.clj debería verse así:

    (load-file "ex1.clj")
    (load-file "ex2.clj")
    (load-file "ex3.clj")
    
    (def testList [4.7 3.3 -17 17 -5.6 -3.3 0])
    (def allThree (comp findMax divisibleSuccess round))
    (def output (allThree testList))
    
    (println "Lista original: " testList)
    (println "Número redondeado más alto divisible por 2: " output)
    

    ¡Espero que esto ayude!

Comments are closed.