Website

Idiom Brackets and the Applicative Pattern:

If you ever see something of the form `f <$> x1 <*> x2....<*> xn`

, this is equivalent to the following:

```
do
x1' <- x1
x2' <- x2
...
xn' <- xn
return $ f x1' x2'...xn'
```

for some n.

For instance, say you want to add all possibilities of values together, say, to simulate rolling 2d6.

Then, you might write

```
do
d1 <- [1..6]
d2 <- [1..6]
return $ d1 + d2
```

However, you may notice that each “extraction” (the left hand side of the arrow) never matters on any previous values of the computation, so it would not change the program’s semantics if instead we write

```
do
d2 <- [1..6]
d1 <- [1..6]
return $ d1 + d2
```

This is in contrast to a different program, still computing over die rolls:

```
do
d1 <- [1..6]
d2 <- [1..d1]
return $ d1 + d2
```

In this case, you can’t write

```
do
d2 <- [1..d1]
d1 <- [1..6]
return $ d1 + d2
```

legally even.

So, if you wish to write the legal applicative program (2d6), then instead of the cumbersome do statement, or its desugaring (`[1..6] >>= (\d1 -> [1..6] >>= (\d2 -> return $ d1 + d2)`

), we can use the aforementioned applicative syntax: `(+) <$> [1..6] <*> [1..6]`

.