[Ur] Interplay between the signal monad and the transaction monad

Adam Chlipala adamc at csail.mit.edu
Mon Aug 17 08:14:10 EDT 2015


On 08/17/2015 01:51 AM, Stefan Scott Alexander wrote:
> (1) Can you use a call to `set`, `get` or `rpc` - or `source` or 
> `current` - (all of which return a *transactional* type) on one of the 
> semicolon-separated lines of the code inside the `signal` attribute of 
> a `<dyn>` tag?

No.  These are in the [transaction] monad, which is different from the 
[signal] monad.

> (2) Are the two collections of operations below fundamentally 
> different / Do they have totally different meanings:
>
> (a) the `;` and `return` and `<-` used in the code of the `signal` 
> attribute of a `<dyn>` tag
>
> (b) the `;` and `return` and `<-` used in the code of the `on_` event 
> attribute of a `<ctextbox>`, `<cselect>` etc. tag?

They're the usual overloaded operations of the [monad] type class.

> (3) What I'm kindof getting at here is this more general question:
>
> We have seen "semicolon-separated" code patterns (for monadic 
> syntactic sugar) such as the following, which can occur in various 
> locations:
>
>   ... <- ... ;
>   ... ;
>   return ...
>
> We also know that there are two monads in Ur/Web: the transaction 
> monad and the signal monad.

There are more monads than that just in the standard library, and it's 
always possible to define your own new ones.

> Question: Is it possible / Does it make any sense to "freely mix"
>
> - operations which return "transactional" types (eg: `set`, `get, 
> `rpc` - or `source`, `current`)
>
> - with operations which return "signal" types (eg: the operation 
> `signal` - or also possibly a function called on an argument of type 
> `signal` - see [Note 1] at the end of this message)
>
> within a *single* occurrence of such a "semicolon-separated" code pattern?

No, and for good reasons.  Transactions are allowed to have all sorts of 
side effects, while signals must be pure to make sense.

> (a) what *contexts* they can be used in - eg, either:
>
> - in the `signal` attribute of a `<dyn>` tag, the above code pattern 
> represents a sequence of "signal operations", versus
>
> - in the `on_` event attribute of a `<ctextbox>`, `<cselect>`, 
> `<body>` etc. tag the above code pattern represents a sequence of 
> "transactions";

The type of the context completely determines the answer to your question.

> (b) what *operations* can be used in them - eg:
>
> - in the `signal` attribute of a `<dyn>` tag, the above 
> "semicolon-separated" code pattern would only allow using the 
> operation `signal` (which returns something of type `signal t`) - plus 
> maybe other functions called on a "variable" assigned to a value 
> returned by a previous call to such a `signal` operation (See [Note 1] 
> at the end of this message)
>
> =versus=
>
> - in the `on_` event attribute of a `<ctextbox>`, `<cselect>`, 
> `<body>` etc. tag, the above "semicolon-separated" code pattern would 
> only allow using operations such as `set`, `get`,  `rpc` - or `source` 
> or `current` - all of which return a *transactional* type.

Again, the type of the context completely determines the answer.

>   ls <- signal lss
>
> So it would seem that `ls` is of type `signal t` (according to page 44 
> of the manual).

No, look more carefully at the type of [bind] (which [<-] desugars to).  
Since [signal lss] has some type [signal t], [ls] gets type [t].

P.S.: I think essentially all your questions should be answered by any 
tutorial on monads in Haskell.



More information about the Ur mailing list