Side-Effect System in D
Dukc
ajieskola at gmail.com
Fri Mar 29 11:09:10 UTC 2024
On Wednesday, 27 March 2024 at 07:47:02 UTC, Per Nordlöw wrote:
> Would be awesome to have Koka's side-effect system in D.
>
> See
> https://koka-lang.github.io/koka/doc/book.html#sec-semantics-of-effects.
Don't we have a pretty good appromixation of `pure`, well,
`pure`? St can also be easily represented by giving the state
object as an extra `ref` parameter.
As for `total`, I don't think it's practical. That would mean no
divisions, no assertions, no normal array indexing.
Besides, often you do have values that are representable by types
of the parameters but that indicate a bug in the caller side if
they're ever passed. You'd want a total function only if what
you're doing actually makes sense for all the possible (`@safe`)
values. If that isn't the case, asserting on invalid values is
the right thing to do as Walter always says, not coming up with
some cover-up return value to make the function total.
For example, if you have a function computing an average over an
integer array, it'd be a bad idea to make that total since you
would have to return a made-up value for an empty array instead
of asserting.
While there are certainly some cases where you could reasonably
make a function total, like bitwise boolean logic, on the whole
it's just not practical to attempt programming in a crash-safe
manner in D. I don't have enough experience in Haskell to judge
if it's practical there, but it at least gets closer. For the
idea to be worthwhile, you need to be able to limit the possible
values of variables with types in the majority of the cases. This
means non-nullable and nullable types for everything, ints with
value range information, float that can't be NaN, non-empty types
for ranges, and so on. And it needs to be extremely easy to
translate those types to each other.
D does not have that kind of type system and it doesn't look like
a good direction of development for it. For example, because all
D types need an `.init` value, it means a general-purpose
non-empty range type would be very difficult to define in a
practical manner. The language simply works very differently from
what total programming style would ask for.
More information about the Digitalmars-d
mailing list