[clean-list] stuck with uniqueness in records

John van Groningen johnvg at cs.ru.nl
Fri Nov 27 14:49:14 MET 2009


Carlos Aya wrote:
>..
>::UMatrix elemType = { rows :: !Int
>                     , cols :: !Int
>                     , vals :: ({#} elemType)
>                     }
>..
>The problem I am facing is update in place of the array vals, I want to have the following function (from implementation)
>
>...........................
>// adds one matrix onto another (in place add)
>fAdd :: *(UMatrix elemType) (UMatrix elemType) -> *(UMatrix elemType) | Array {#} elemType & Arith elemType
>fAdd m1 m2
>| sameSize m1 m2
>    # (arr, m1) = m1!vals   // <--- PROBLEM HERE
>    = {m1 & vals = updateInPlace arr f (size m2.vals)}
>= abort "Invalid matrix add"
>where
>    f v p = v + m2.vals.[p]
>..
>
>The problem is that updateInPlace expects a unique array, but the signature I am getting in PROBLEM HERE is
>
>m1!vals :: ({#a}, u:(UMatrix v:a))
>
>i.e., the array inside the record is not unique (at least, this is how I understand it).
>
>I have tried to define UMatrix with . and attribute variables in the hope that it will change the signature of the record "!" operator, but with no luck. And read the manual and the clean book but nothing said in b&w about the "!" operator, at least for me as I couldn't link the whole concept of uniqueness propagation for records.
>
>How can I extract the array from the unique parameter in fAdd and expect it to be unique?

Add a . before the array type in the declaration of type UMatrix:

::UMatrix elemType = { rows :: !Int
                     , cols :: !Int
                     , vals :: . {#elemType}
                     }

this makes the array unique if the record is unique,

and do not try to use ! to extract unique elements. This doesn't work
because of a limitation in the reference analysis. Instead extract
the element using a pattern match or a selection with .

Kind regards,

John van Groningen


More information about the clean-list mailing list