#haskell
#haskell
Вопрос:
У меня есть следующие методы:
mainFunction arg1 = "http://someBaseUrl.com/" arg1
url1 x = mainFunction x "/subUrl1"
url2 x = mainFunction x "/subUrl2"
url3 x = mainFunction x "/subUrl3"
url4 x = mainFunction x "/subUrl4"
Моя интуиция подсказывает мне, что это должно быть упрощено. Но я не могу понять, как это сделать.
Однако я не могу этого сделать, потому что это не одно и то же:
url1 = (mainFunction .) "/subUrl1"
Ваши предложения?
Ответ №1:
Вы можете сделать
url s x = mainFunction x s
url1 = url "/subUrl1"
url2 = url "/subUrl2"
и т.д…
Если вы действительно хотите написать как можно меньше кода и избежать url
древовидных вызовов, вы можете использовать этот трюк (однако я не уверен, что это рекомендуется)
[url1, url2, url3, url4] = map url ["/subUrl1", "/subUrl2", "subUrl3", "subUrl4"]
При этом будут объявлены четыре функции url1
, … url4
.
Комментарии:
1. какой аргумент «s»?
2. и почему вы вызываете «url» только с одним аргументом?
3.
s
это ваш suburl. Я вызываю его только с одним аргументом, потому что второй не нужен. Я мог бы написать,url1 x = url "/subUrl1" x
что похоже на то, что вы написали, но в этом случае это эквивалентноurl1 = url "/subUrl1"
(вы можете удалить x с обеих сторон). Это называется частичным применением
Ответ №2:
Почему вы не используете единственную функцию с двумя аргументами?
url :: (Show a) => String -> a -> String
url x n = "www" x "/vvv" show n
Вам также следует использовать Text
при работе с URL-адресами и юникодом в целом.
Ответ №3:
Вы можете объединить строки, чтобы создать свой URL. Чтобы преобразовать нестроковое значение в строку, вы можете использовать show
, если это экземпляр Show .
url a b = "http://someBaseUrl.com/" a "/subUrl" (show b)
Функция URL принимает «строку» (список символов) [Char] и другой тип ‘a’ (который также является экземпляром Show) и возвращает новую «строку».
Prelude> let url a b = "http://someBaseUrl.com/" a "/subUrl" (show b)
Prelude> url "foo" 3
"http://someBaseUrl.com/foo/subUrl3"
Prelude> :t url
url :: Show a => [Char] -> a -> [Char]