♾️

あるリストの要素が全て同一であることを判定する

2023/11/10に公開

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 によると、 distinctset のほうは、無限シーケンスに対しては機能しないのであまり良くない、とのこと。 だけど、 distinctset にわたすときに無限遅延シーケンスのままわたすことってあるのだろうか、よく分からない。

Discussion