Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

We are still figuring out the details about array impurity. But in a nutshell if something is pure it should support substitution. For example:

let x = 123; let y = (x, x)

If you substitute x into the pair you get the same result. So far, so good.

Now consider:

let x = [1, 2, 3]; x[0] = 5; let y = x[0]

If you substitute x into the body of y you get a different result! The meaning of x[0] changed underneath you. We are very conservative and say that anything which touches an array is impure. Is this the best solution? no- but it is a reasonable/sound start.

(I am one of the authors of Flix).



Hey, thanks for replying!

> But in a nutshell if something is pure it should support substitution.

Neat, hadn't thought about it like that before.

> If you substitute x into the body of y you get a different result!

Heh, I guess that depends on "which" x. I recognize Flix doesn't allow shadowing as a defensive choice, but with respect to substitution, wouldn't this be equivalent to something like:

    let x = [1, 2, 3]
    let x = insert(0, 5, x) # treating it like Map [1]
    let y = get(0, x)
IOW, it's not clear to me why the `x[0] = 5` step would be skipped when considering substitution. Hmm, per the substitution principle, is `x[0] = 5` pure?

> We are very conservative and say that anything which touches an array is impure.

Understandable given how difficult it is to reason about mutable things.

----

[1] Given the uniform function call syntax, I found it odd that the map is the last arg in the function. I originally assumed it would be m.insert(k, v) === insert(m, k, v)




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: