Вы можете указать в своей подписи типа, что тип должен быть экземпляром Show
.
displayList :: Show a => [a] -> IO ()
Хотя ваша рекурсия выглядит немного не так. Я бы начал с этого скелета:
displayList [] = _base
displayList (x : xs) = _rec
Вам не нужны никакие охранники, и вам не нужно использовать null
.
Примечание: для отображения списков определенными способами требуются два базовых случая:
displayList [] = _base0
displayList [x] = _base1
displayList (x : xs) = _rec
Исходя из вашего кода, я не думаю, что вам это нужно здесь, но так как вы не не показывать пример того, что вы хотите, трудно сказать наверняка.
Нет ограничений на экранированные имена параметров в спецификациях URI. Однако в используемом вами серверном программном обеспечении могут быть ограничения. Это особенно верно, если вы используете «домашние» сценарии для интерпретации URI.
Для URL-адресов есть зарезервированные символы, но если вы укажете (urlencode), то с вами все будет в порядке.
В зависимости от используемой платформы вы можете получить исключения, если попытаетесь отправить подозрительные ценности. ASP.NET имеет фильтрацию содержимого, которая будет генерировать исключения, если вы попытаетесь отправить «небезопасные» данные, такие как сценарии или HTML. Это особенность платформы, а не ограничение или правило, налагаемое синтаксисом URL.
Вы также должны прочитать RFC2396 . Он кажется более информативным, чем RFC3986.