I'm really surprised that Haskell didn't take off here. Strong types, plus lazy evaluation that seems perfect for orchestrating asynchronous GPU operations.
I don’t have much experience with CL, but I was always a bit put off by a mixture of different paradigms it has, ie it’s not being a pure or kinda pure functional language.
I don't know what is in the book, but things are possible.