Это не специальный синтаксис, и иногда он вам просто нужен, как в следующем случае:
foo :: String -> String
foo s = show (read s)
В нынешнем виде его нельзя набирать, поскольку тип значения read s
не может быть идентифицирован. Все, что известно, это то, что это должен быть экземпляр Show и Read. Но этот тип вообще не отображается в сигнатуре типа, поэтому также невозможно оставить его при этом и вывести ограниченный тип. (Просто нет переменной типа, которую можно ограничить.)
Интересно отметить, что то, что делает read s
, полностью зависит от сигнатуры типа, которую каждый дает read s
, например:
read "Just True" :: (Maybe Bool)
будет успешным, а
read "Just True" :: (Maybe Int)
не будет.