11 ms·
I never understood the convention of using single letter names for generic parameters. I guess this started in C++ and every language has copied that convention
by adrianmsmith 2mo ago
I never understood the convention of using single letter names for generic parameters. I guess this started in C++ and every language has copied that convention.
I think that code would be a lot easier to read if the types were called IN and OUT or In and Out or TIn and TOut or something like that.
- jiehong 2mo agoWe all know letters are expensive ^^
- phplovesong 2mo agoIm pretty sure it came from the MLs, where you usually have a/b/c instrad of the T,U etc combo. I dont find it confusing, as its pretty clear that it only an placeholder. In generics the name usually does not matter or is REALLY hard to name so that it makes sense. More specifically in Go where you have interfaces, concrete types and generics.
- asQuirreL 2mo agoFairly sure it would predate even that, and go all the way to lambda calculus, and predicate logic before that, and that's where my knowledge stops and somebody else can tell us where the current conventions around variables in logic and mathematics come from.
- teh64 2mo agoIn ocaml (and I assume SML) it helps that the generic types have a `'` before them, so val map : ('a Box) -> ('a -> 'b) -> 'b Box
- spockz 2mo agoCompletely agree and I personally name generic type parameters as I would name types and parameters. It helps a lot.
- Someone 2mo agoFor maps, a convention is to use K and V for key, respectively Value. I think that’s best as you’ll soon learn the “single-character capital letter ⇒ generic parameter” convention
- Laurel1234 2mo agoIn C# this is the convention.
- eterm 2mo agoIt's a mix, because some stuff tends to just use `T`, but there's better descriptors elsewhere. There's IList<T> but Task<TResult> There's Action<T1, T2, T3, T4, T5, T6> but also Dictionary<TKey, TValue> and Map<TIn, TOut> This stuff kind of "makes sense" once you're used to it, because it's difficult to say what IList<T> ought to have been called otherwise, IList<TContainee> is a mouthful, and Action<T1,...> simply suffers from the inability to specify an unknown number of generic parameters. https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ilist-1?view=net-10.0 https://learn.microsoft.com/en-us/dotnet/api/system.collecti... https://learn.microsoft.com/en-us/dotnet/api/system.action-2?view=net-10.0 https://learn.microsoft.com/en-us/dotnet/api/system.action-2... https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2?view=net-10.0 https://learn.microsoft.com/en-us/dotnet/api/system.collecti...
- setopt 2mo agoI believe Haskell did that for decades before C++.
- logicchains 2mo agoHaskell was created in 1990, five years after C++.
- toinebeg 2mo agoI often use whole word for type annotation, when I can find meaningfull ones. I just type them in all caps to stay close to the convention. I guess the single letter thing is laziness for a part. It's not simple to find words that represent the abstract idea behind the generic type without narrowing the possibilities. For array function, the Key Value from the sibling comment work but for more complex use case, it get complicated.
- fooooor 2mo ago[flagged]
- wwalexander 2mo agoSwift generics tend to idiomatically use longer names, like Element or View or Content.
- majewsky 2mo agoI'm not necessarily disagreeing, but I'm following the single-letter convention because "TIn" or "InputType" looks too much like an exported symbol. Whenever I tried to write type arguments like that, this threw me off, so I reverted to single letters.