const S = x => y => z => (x(z))(y(z))
S(K)(() => cat)(dog)
S(K)(K(cat))(dog)
S(K)(() => {})(cat => dog)()

K reminded me of SKI calculus and since K technically corresponds to true I went looking for false and saw the wikipedia article actually implements false with the help of the S combinator. One minor issue is that since javascript is not lazily evaluated the second argument has to be a suspended computation for things to work.

## re: The easiest problem you cannot solve. VIEW POST

FULL DISCUSSIONSome I didn't see

`K`

reminded me of SKI calculus and since`K`

technically corresponds to`true`

I went looking for`false`

and saw the wikipedia article actually implements`false`

with the help of the`S`

combinator. One minor issue is that since javascript is not lazily evaluated the second argument has to be a suspended computation for things to work.Awesome work!

You found the clue I left, the K combinator! And it does come from the SKI calculus.

So many interesting solutions!

This one is pretty creative. Modifying the original

`K`

function to swap`a`

and`b`

. I like it.In hindsight I should have realized that turning the function into

`a => a => a`

looks suspiciously like the`I`

combinator.Exactly! That is definitely the

`I`

combinator. It works beautifuly with the`K`

combinator in the problem to solve this problem.Two parts of

`SKI`

combinator calculus!