J'ai eu une idée pour une fonction d'ordre supérieur aujourd'hui que je ne suis pas sûr de savoir comment écrire. J'ai plusieurs séquences infinies, paresseuses, et je veux créer une abstraction qui me permet de vérifier si un nombre donné est dans l'une de ces séquences paresseuses. Pour améliorer les performances, je voulais pousser les valeurs de la séquence fragmentée dans un hashmap (ou ensemble), en augmentant dynamiquement le nombre de valeurs dans le hashmap chaque fois que cela est nécessaire. Mémo automatique n'est pas la réponse ici en raison de la parcimonie des seqs paresseux. Le code est probablement le plus facile à comprendre, alors voici ce que j'ai jusqu'à présent. Comment puis-je modifier le code suivant afin que le prédicat utilise un hashmap fermé, mais si nécessaire, augmente la taille du hashmap et redéfinit lui-même pour utiliser le nouveau hashmap?Comment écrire un prédicat qui vérifie si une valeur existe dans un seq infini?
(defn make-lazy-predicate [coll]
"Returns a predicate that returns true or false if a number is in
coll. Coll must be an ordered, increasing lazy seq of numbers."
(let [in-lazy-list? (fn [n coll top cache]
(if (> top n)
(not (nil? (cache n)))
(recur n (next coll) (first coll)
(conj cache (first coll)))]
(fn [n] (in-lazy-list? n coll (first coll) (sorted-set)))))
(def my-lazy-list (iterate #(+ % 100) 1))
(let [in-my-list? (make-lazy-predicate my-lazy-list)]
(doall (filter in-my-list? (range 10000))))
Comment résoudre ce problème sans revenir à un style impératif?
Je trouve conceptuellement difficile de prouver qu'une valeur n'est pas contenue dans une séquence infinie. – Svante
Oh, OK, ils sont commandés. – Svante