Concurrent Clean : share file

share fileといっても、プロセス間共有するという話ではない。
Cleanでファイルを取り扱うときは、通常、一意性型属性付きで取り扱うのだが、一意性型属性なしで取り扱うこともできるのだ。ただし、読取専用で、一度オープンするとクローズする方法はない。標準入力は使えない。・・・あまり使い道が思い浮かばないのだけど。

Start w # (_,f,w) = sfopen "num.txt" FReadText w  // share fileをオープン
          n = fn [0..10] f
          f = fwritei n stderr
          (_,w) = fclose f w
        = w

fn :: ![Int] !File -> Int
fn ls f = sum2 0 ls
  where
    sum2 a [] = a
    sum2 a [x:xr] # (_,i,_) = sfreadi f  // share fileから読み取り
                  = sum2 (a+x+i) xr

num.txtは次の通り。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

結果は「11」になります。ということは、読み取りカーソルが動いていないということですね。カーソルを移動させるには、sfreadiの返値のfを受け渡さないとダメなのかな。