パスカルの3角形は次のコードで生成できる。

pascal = iterate next [1]
where next xs = zipWith (+) (:xs) (xs++[])
showPascal n = mapM_ print.take n$pascal
*Main> showPascal 10

とすれば、次のようなパスカルの三角形が得られる。

[1]
[1,1]
[1,2,1]
[1,3,3,1]
[1,4,6,4,1]
[1,5,10,10,5,1]
[1,6,15,20,15,6,1]
[1,7,21,35,35,21,7,1]
[1,8,28,56,70,56,28,8,1]
[1,9,36,84,126,126,84,36,9,1]

まぁ、ここまでは普通(これから後かも普通かもしれないが…)。

ここで、この三角形を Mod 2 してみると、あの有名なシェルピンスキーのギャスケットが現れる。

コードは下のようなもの。

pascalMod n = iterate next [1]
where next xs = zipWith addMod (:xs) (xs++[])
addMod x y = (x+y) `mod` n
showSierpinski n = mapM_ print.map (map toSign).take n$pascalMod 2
where toSign x | x ==  = '_'
| otherwise = '*'
*Main> showSierpinski 48

とすると、

"*"
"**"
"*_*"
"****"
"*___*"
"**__**"
"*_*_*_*"
"********"
"*_______*"
"**______**"
"*_*_____*_*"
"****____****"
"*___*___*___*"
"**__**__**__**"
"*_*_*_*_*_*_*_*"
"****************"
"*_______________*"
"**______________**"
"*_*_____________*_*"
"****____________****"
"*___*___________*___*"
"**__**__________**__**"
"*_*_*_*_________*_*_*_*"
"********________********"
"*_______*_______*_______*"
"**______**______**______**"
"*_*_____*_*_____*_*_____*_*"
"****____****____****____****"
"*___*___*___*___*___*___*___*"
"**__**__**__**__**__**__**__**"
"*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*"
"********************************"
"*_______________________________*"
"**______________________________**"
"*_*_____________________________*_*"
"****____________________________****"
"*___*___________________________*___*"
"**__**__________________________**__**"
"*_*_*_*_________________________*_*_*_*"
"********________________________********"
"*_______*_______________________*_______*"
"**______**______________________**______**"
"*_*_____*_*_____________________*_*_____*_*"
"****____****____________________****____****"
"*___*___*___*___________________*___*___*___*"
"**__**__**__**__________________**__**__**__**"
"*_*_*_*_*_*_*_*_________________*_*_*_*_*_*_*_*"
"****************________________****************"

実はMod 2でなくても、Mod 3などでも良い。が、Mod 2が見た目がいい気がする。