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を受け渡さないとダメなのかな。