Concurrent Clean : 文字列の一意性型属性

id:sshiさんの指摘が気になって、あれこれ試してみたら、全然共有できるんですけど。
たとえば、こんな感じ。

Start w = w --> stdio
            --> \(f,w) = f
            --> fwrites "input >"
            --> freadline
            --> \(line, f) = f
            --> fwrites $ reverseStr line
            --> if (line == "123") id (trace "ng")
            --> flip fclose w
            --> \(ok,w) = if ok w (trace "error on close" w)

reverseStr :: {#Char} -> {#Char}
reverseStr s = {c \\ c <- reverse [c \\ c <-: s]}

あれー。たしかにStdFileの関数型宣言には、一意性型属性がついてるのに・・・。

      • -

当然、こういうのはとおらないんだけどなぁ。

useUniqStr :: !*{#Char} !*File -> (!*{#Char}, !*File)
useUniqStr line f
        = f --> fwrites $ reverseStr line
            --> if (line == "123") id (trace "ng")
            --> \f = (line, f)