como funciona 'indefinido' em Haskell

Estou curioso sobre o valor 'indefinido' em Haskell. É interessante porque você pode colocá-lo em qualquer lugar, e Haskell ficará feliz. Os seguintes são todos ok

[1.0, 2.0, 3.0 , undefined]  ::[Float]
[1, 2 ,3 undefined, 102312] :: [Int]
("CATS!", undefined)  :: (String, String)
....and many more

Como o trabalho indefinido sob o capô? O que torna possível ter dados de todos os tipos de dados? Seria possível para mim definir um valor como esse que eu possa colocar em todos os lugares, ou isso é um caso especial?