Борьба за упрощение кода

#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]