Traditionally, command line utilities that accept filenames for input/output treat "-" name specially: it means to use stdin/stdout instead of opening files. On Linux¹ there is /dev/stdout file, so we can use it when we want to refer to standard output and get rid of special handling of "-", can't we?
Turns out, there is subtle but important difference, that is best illustrated by following example²:
$ readlink -f /dev/stderr 2>/tmp/foo
/tmp/foo
$ readlink -f /dev/stdout 2>>/tmp/foo
/tmp/foo
No matter what mode shell redirection is /dev/std* files are symlinks to the actual file, so if the program decides to open /dev/stdout in overwrite mode, it it will truncate output file even if shell says "append".
In other words, the following program has a dangerous bug:
main :: IO ()
main = writeFile "/dev/stdout" "Hello, world!"
¹ Provided devtmpfs virtual file system is mounted, which is the case in all but most obscure scenarios.
² Credit for so eloquent illustration goes to Dmitry Shachnev, with whom I have been debugging consequences of that difference.