It's not semantically different from sort [] = []; sort (x:xs) = sort (filter (< x) xs) ++ filter (== x) xs ++ sort (filter (> x) xs) in Haskell (modulo laziness). The parallel structure in the J code should be plainly evident even if you don't know anything about J.