3 ms·
No, optional really isn't needed in crystal. You can just add `| Nil` to any type wherever you use it. We ever have a short cut in the type syntax of the langua
by RX14 8y ago
No, optional really isn't needed in crystal. You can just add `| Nil` to any type wherever you use it. We ever have a short cut in the type syntax of the language `?` to add null to a type union. So in practice at the type layer all you're doing is replacing Maybe Type with Type?. But now you have a strictly more powerful construct which behaves like options in some ways (you can call try on any union with nil because all types including nil implement the try method) but supports flow typing for null checking, removing all of the extra dereferencing syntax for option types.
- flipgimble 8y agoThis is also how Swift implements it support for optional. So far I don’t see a difference in expressive power between the two languages. A user never has to actually type out Optional, when adding ? is enough. Swift also has optional chaining and nil coalescing operators as syntactic sugar. Under the hood there is still an Optional type for the type checker to work with. I think this is becoming a trend in modern language design. However as this comments section demonstrates it’s hard to understand its benefits or why it’s an important improvement, if your only experience is from C/C++/C#/Java etc
- RX14 8y agoDoes swift have flow typing? The expressive power of sum types with nil is only exposed with flow typing. Also I don't think swift supports arbitrary sum types it just has a "fake" sum type syntax that only works with null. In crystal you can have an `Int32 | String` just the same as you can have an Int32?
- Zarel 8y agoSwift doesn't have flow typing, unfortunately. It has a few constructs, like `guard let` and `if let`, which let you unwrap optionals in a somewhat nicer way than other languages and are sort of similar to one aspect of flow typing.
- Veedrac 8y agoYou mean "union type" where you say "sum type". AFAICT Swift does support sum types.
- RX14 8y agoyeah in crystal we call them union types. We don't have sum types so I'm not really certain on the difference. I should have stuck to terminology I know.
- AnimalMuppet 8y agoI've seen this come up a couple of times in this discussion, so ELI5: What is "type flowing"?
- RX14 8y agoFlow typing is where the type of a variable changes based on control flow. Consider: x : Int32 | String if x.is_a? Int32 # typeof(x) == Int32 else # typeof(x) == String end
- AnimalMuppet 8y agoThanks!
- Veedrac 8y agoSwift has sum types, not union types.