Concurrent Clean : 一意型と上手く付き合うには?

Cleanで実用的なプログラミングをするには、一意型を使わざるを得ないので、命令的なプログラミングになって、純粋関数型言語を使っているメリットが全然ないという不満があったのですが、SICPを読み進めるうちに、上手いやりようはあるのではないかと思うようになってきました。


基本的なアイデアは、以下のような関数に対してさまざまな変換を加えていく高階関数を組み合わせてプログラミングをしていくということです。

::FileReader :== *File -> *File
::Painter :== *Canvas -> *Canvas


たとえば、こんな感じのプログラミングを行うことができます。

makeStringPainter :: *File -> (Painter, *File)
makeStringPainter f0
    = (paintString, f1)
where
    (str, f1) = freadline f0
    
    paintString :: *Canvas -> *Canvas
    paintString c
        = drawString str c

drawRepeat :: Int Painter -> Painter
drawRepeat n p
    = iter n p