and my code so far look like this:
noise2d :: (Int32, Int32) -> Double
noise2d (x, y) =
let m = x + y * 57
n = (shiftR m 13) ^ m
j = (n * (n * n * 15731 + 789221) + 1376312589) .&. 0x7fffffff
in 1.0 - (fromIntegral j / 1073741824.0)
the code compile but I get the same result for any input, due to the fact that n is evaluated to 0.