♾️
あるリストの要素が全て同一であることを判定する
Clojure で、あるリストの要素が全て同一であることを判定する、をどう書くか
(def lst '(10 10 10 10 10))
distinct で重複を排除したとき要素数が1つになるか、で書いてた。
(->> lst distinct count (= 1))
;=> true
似た書き方で、 Set (重複しない複数の要素を保持する)に詰め込んでみて要素数が1になるか、というふうにも書ける。
(->> lst (into #{}) count (= 1))
しかし Clojure の =
は可変長に引数を受け取るので、それを apply
する書き方が可能。そのほうが簡潔になる。
(apply = lst)
;=> true
ただし空のリストに対する挙動が異なるので注意。 =
は引数が0のときに true を返すので。
(def lst2 '())
(apply = lst2)
;=> true
(->> lst2 distinct count (= 1))
;=> false
(->> lst2 (into #{}) count (= 1))
;=> false
さらに https://stackoverflow.com/questions/32450837/verify-that-all-elements-of-a-list-are-equal によると、 distinct
や set
のほうは、無限シーケンスに対しては機能しないのであまり良くない、とのこと。 だけど、 distinct
や set
にわたすときに無限遅延シーケンスのままわたすことってあるのだろうか、よく分からない。
Discussion