Excellent article, thanks! If their experience reflects the state-of-the-art in Elm, then I guess I'm on the right track. I absolutely agree with a key sentiment of the article: I'm looking for something with the compiler-orientedness of Haskell's newtype. Ignoring the mostly superficial wart of needing to un/repacking my types, single-constructor unions get me what I need.
On Monday, January 16, 2017 at 11:03:45 AM UTC+1, Magnus Rundberget wrote: > > Hi, > > I haven't given it too much though, but I do think there is some very nice > benefits to using single constructor union types. > In you case, you might avoid some of the noise by adding helper functions > to work on values of the type (maybe you need a mapFoo helper function). > I found this blog post quite enlightening : > https://robots.thoughtbot.com/lessons-learned-avoiding-primitives-in-elm > > cheers > - magnus > > > > On Monday, 16 January 2017 09:40:13 UTC+1, Austin Bingham wrote: >> >> I recently had to chase down a bug where I was calling a function with >> the arguments in the wrong order. The function's declared argument types >> were each an alias for string, so the compiler happily let me swap them. In >> order to avoid this in the future, I'm experimenting with using >> single-constructor union types in place of aliases, e.g. instead of "type >> alias Foo = String" I'm using "type Foo = Foo String". >> >> This seems to work well for helping me enforce the kind of type safety >> I'm looking for. However, it seems to force me to do a lot more >> de/restructuring of function arguments, and it feels a bit graceless. For >> example, a (contrived) function that was originally like this: >> >> aFunc : Foo -> Foo >> aFunc f = >> let >> x = somethingWithAString f >> in >> somethingWithAFoo x f >> >> becomes: >> >> aFunc : Foo - > Foo >> aFunc (Foo f) = >> let >> x = somethingWithAString f >> in >> -- Have to "repack" f into a Foo >> somethingWithAFoo x (Foo f) >> >> That is, if I want to thread something of type "Foo" through calls while >> also using its data, I have to "repack" it. >> >> So my question is: are there better ways to do this? Are there better >> patterns for a) adding the type-safety I want while b) avoiding the extra >> noise? I know some languages (e.g. clojure) let you destructure bindings >> *and* bind a name to the un-destructured thing. Something like that might >> help. >> >> Any advice (including "you're doing it wrong!") would be appreciated. >> >> Austin >> > -- You received this message because you are subscribed to the Google Groups "Elm Discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
