Traditionally, command line utilities that accept filenames for input/output treat "-" name specially: it means to use stdin/stdout instead of opening files. On Linux1 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 example2:
$ 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!"