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]
内包表記のガード節はうまくかけるようになってきたので今度はモナドでもやってみるかな。