Looks like it's already mentioned, and I somehow have missed it even though I've read the typespec docs a few times:
https://github.com/elixir-lang/elixir/blame/9fd2633b6e25d9676db0d6c3e9cf7e951caebfa3/lib/elixir/pages/Typespecs.md#L180-L183 On Sunday, December 11, 2016 at 1:08:53 PM UTC-8, eksperimental wrote: > > It's not common, but it is supported > > lib/elixir/lib/file.ex > 1006: @spec open(Path.t, [mode | :ram]) :: {:ok, io_device} | {:error, > posix} > 1007: @spec open(Path.t, (io_device -> res)) :: {:ok, res} | {:error, > posix} when res: var > > lib/elixir/lib/file.ex > 1061: @spec open!(Path.t, [mode | :ram]) :: io_device | no_return > 1062: @spec open!(Path.t, (io_device -> res)) :: res | no_return when > res: var > > Adding that to the Typespecs page would be good! > > On Sun, 11 Dec 2016 21:56:17 +0100 > Michał Muskała <[email protected] <javascript:>> wrote: > > > As far as I know it should "just work™". > > > > Michał. > > > > > On 11 Dec 2016, at 21:11, Myron Marston <[email protected] > <javascript:>> wrote: > > > > > > Today I was reading through http://learnyousomeerlang.com/dialyzer > and stumbled across this: > > > > > > -spec convert(tuple()) -> list() > > > ; > > > > > > (list()) -> tuple() > > > . > > > > > > convert(Tup) when is_tuple(Tup) -> tuple_to_list(Tup > > > ); > > > > > > convert(L = [_|_]) -> list_to_tuple(L > > > ). > > > > > > Rather than putting tuple() and list() types together into a single > union, this syntax allows > > > you to declare type signatures with alternative clauses. If you call > convert/1 with a tuple, we > > > expect a list, and the opposite in the other case. > > > > > > I’ve never seen this in Elixir typespecs before and the docs make no > mention of Elixir > > > supporting multiple clauses in a type spec. Is this something Elixir > supports (or could it in > > > the future)? I can imagine a syntax like: > > > > > > @spec convert(tuple) :: > > > list > > > > > > @spec convert(list) :: > > > tuple > > > > > > def convert(tup) when is_tuple(tup), do: Tuple.to_list(tup) > > > def convert([_ | _] = list), do: List.to_tuple(list) > > > Basically, just allowing us to list multiple type spec clauses > sequentially like we do with > > > function clauses, with line breaks in between. > > > > > > If this is already supported, I can work on updating the type spec > docs to mention it. > > > > > > Thanks, > > > Myron > > > > > > > > > -- > > > You received this message because you are subscribed to the Google > Groups "elixir-lang-core" > > > group. To unsubscribe from this group and stop receiving emails from > it, send an email to > > > [email protected] <javascript:>. To view this > discussion on the web visit > > > > https://groups.google.com/d/msgid/elixir-lang-core/6bf79af0-6f26-42f7-83e6-35c7f0b7c37f%40googlegroups.com. > > > > > For more options, visit https://groups.google.com/d/optout. > > > > -- You received this message because you are subscribed to the Google Groups "elixir-lang-core" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/c1dc2630-035b-48f6-97bb-c68f80e08919%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
