I guess C# is more strongly-typed than Haskell then... /s
String literal typing appears to be a common feature of type systems bolted onto dynamic languages:
# Python MyStringBool = Literal("Yes") | Literal("No") // TypeScript type MyStringBool = "Yes" | "No"
It would seem pretty unnecessary in Haskell, where you can just define whatever types you want without involving strings at all:
data MyBool = Yes | No
parseMyBool :: String -> MyBool parseMyBool "Yes" = Yes parseMyBool "No" = No parseMyBool _ = error "..."
@type my_bool() :: :yes | :no @spec parse_my_bool(String.t()) :: my_bool() def parse_my_bool("Yes"), do: :yes def parse_my_bool("No"), do: :no def parse_my_bool(_), do: throw("...")
You cant have a `type Foo = String | Strimg` in Haskell either.
String literal typing appears to be a common feature of type systems bolted onto dynamic languages:
I assume it exists to compensate for the previous lack of typing, and consequent likelihood of ersatz typing via strings.It would seem pretty unnecessary in Haskell, where you can just define whatever types you want without involving strings at all:
Of course you'd need a trivial parser, though this is probably a good idea for any string type: Interestingly, dynamic languages which make use of symbols (Ruby, Elixir, Common Lisp) probably fall closer to Haskell than Python or TS. Elixir example: Where :yes and :no are memory-efficient symbols, not strings.