Ну вот если в том примере
false
иnull
имеют действительно разную семантику и предполагается, что вызывающий код будет как-то это обрабатывать, то удобно было бы завернуть возвращаемое значение в case class или вернуть специфические значения названные как-то вроде Nothing, Null - назвав их в соответствии с семантикой возвращаемых значений.А ещё по ним дёшево делается ветвление / pattern matching.
а, в смысле алгебраические типы обыкновенные. их можно эмулировать, но даже и не нужно, тип false|null|string
уже обязывает обработать все случаи, но гибче. например если бы на обоих типах был бы один метод, он был бы доступен без проверки.
Но на самом деле никто не заморачивался такими вещами как правильная обработка всех ситуаций, а то бы метод false
не возвращал бы вовсе :-)