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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.