On Tuesday, November 15, 2016 at 10:11:34 PM UTC-6, Eunmin Kim wrote: > > Hi! I had a question while reading Functional Programming in Scala book. > > The following code is Exercise 2: > > // Exercise 2: Implement a polymorphic function to check whether > // an `Array[A]` is sorted > > def isSorted[A](as: Array[A], gt: (A,A) => Boolean): Boolean = { > @annotation.tailrec > def go(n: Int): Boolean = > if (n >= as.length-1) true > else if (gt(as(n), as(n+1))) false > else go(n+1) > > go(0) > } > > In the above code, Generic typ parameter(A) is displayed. How should I > express it in clojure spec? >
Because Clojure doesn't have generics, there is no direct representation of A in the Clojure version. If you want to ensure that all elements of the collection are of the same type, then say that. (defn same-type? [coll] (or (empty? coll) (let [t (class (first coll))] (every? #(= t (class %)) coll)))) (s/fdef sorted-coll? :args (s/cat :as (s/and (s/coll-of any?) same-type?) :ordered-fn? ifn?) ;; cheating for brevity :ret boolean?) > (defn sorted-coll? [as ordered-fn?] > (loop [coll (seq as)] > (cond > (= 1 (count coll)) true > just by inspection, this is broken for empty collections - should be <= 1 here > (not (ordered-fn? (first coll) (second coll))) false > :else (recur (rest coll))))) > > And I would be remiss not to mention that a) there is an existing sorted? predicate that I would use for this purpose b) the sorted set and map implementations in Clojure already require that elements are all of the same type for the comparator to work -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.