haskellのリストと比較

haskellってリストが比較できるのか気がついていなかった。

*Main> [1,2,3]==[1,2,3]
True
*Main> [1,2,3]==[1,2]
False
*Main> [1,2,3]==[1..]
False

さすが遅延評価

*Main> [1..]==[1..]
^CInterrupted.

やっぱかえってこないよな。

*Main> let factors x=[y|y<-[1..x],mod x y==0] in factors 6
[1,2,3,6]

こうやって素因数分解すればリストの比較で素数かどうかを判定できる

*Main> let factors x=[y|y<-[1..x],mod x y==0] ; isPrime x=factors x==[1,x] in factors 6
[1,2,3,6]
*Main> let factors x=[y|y<-[1..x],mod x y==0] ; isPrime x=factors x==[1,x] in isPrime 6
False
*Main> let factors x=[y|y<-[1..x],mod x y==0] ; isPrime x=factors x==[1,x] in isPrime 7
True

すごいなあ。

(√xまでじゃなくてxまで計算するから)速度は全く出ないけどxまでの素数を計算する関数も簡単に作れる。

*Main> let factors x=[y|y<-[1..x],mod x y==0] ; isPrime x=factors x==[1,x] ; primes x=[y|y<-[1..x],isPrime y] in isPrime 7
True
*Main> let factors x=[y|y<-[1..x],mod x y==0] ; isPrime x=factors x==[1,x] ; primes x=[y|y<-[1..x],isPrime y] in primes 7
[2,3,5,7]

内包表記のガード節はうまくかけるようになってきたので今度はモナドでもやってみるかな。