
* pbrowne wrote:
semantics). I used the following type synonym:
type String = [Char] type Name = String String, Name and [Char] are synonyms, which means every expression is identically to the others. There is no difference besides that String and Name are type aliases while [Char] is a type construct. getName :: String -> Name getName n = n
I checked the types with two tests: -- test 1 :t "ww" "ww" :: [Char]
The type interference system determines that you have an array of characters, hence a [Char]. All those existing type aliases are suppressed by the module. Otherwise the list get's very long ...
-- test 2 :t getName("ww") getName("ww") :: Name
From the definition of getName, the compiler knows which type alias is prefered from the set of equivalent names.
Obviously I get two different types.
You get two different representations of the same type.
In the case of the function Haskells type system seems to pick up enough information to determine that “ww” is a Name.
Nope. "ww" is still a [Char] for the compiler. And you do not even check for the type of "ww". :t snd . (\x -> (getName x, x)) $ "ww" ... :: String