Подтвердить что ты не робот

В Haskell, как вы можете умножить строку?

Я пытаюсь написать функцию, которая принимает String и Int, и возвращает эту строку "int". То есть:

duplicate :: String -> Int -> String

Если я должен был написать duplicate "Hello" 3, вывод должен быть "HelloHelloHello".

4b9b3361

Ответ 1

Легко:

duplicate :: String -> Int -> String
duplicate string n = concat $ replicate n string

$ функция типа (a -> b) -> a -> b. Язык позволяет использовать функции с не-альфа-числовыми именами в форме infix (как операторы). I., тело указанной выше функции абсолютно идентично следующему выражению:

($) concat (replicate n string)

То, что $ делает, просто позволяет вам избавиться от брекетов. Это означает, что приведенные выше выражения являются просто альтернативой следующему выражению:

concat (replicate n string)

Ответ 2

A String является просто синонимом списка Char, а тип списка - Monad. Поэтому

duplicate :: Int -> String -> String
duplicate n str = [1..n] >>= const str

Или, если вы хотите получить все бессточные

duplicate = (. const) . (>>=) . enumFromTo 1

Edit

Как указано в комментариях

duplicate n str = [1..n] >> str

или

duplicate = (>>) . enumFromTo 1

Ответ 3

Вы можете использовать replicate и concat следующим образом:

duplicate :: [a] -> Int -> [a]
duplicate = flip $ (concat .) . replicate

-- or as larsmans suggested:

duplicate :: [a] -> Int -> [a]
duplicate = (concat .) . flip replicate

Затем используйте его как duplicate "Hello" 3.

Ответ 4

Вы можете использовать сопоставление образцов.

duplicate _ 0 = []
duplicate xs n = xs ++ duplicate xs (n-1)

или

duplicate xs n  | n==0 = []
                | otherwise = xs ++ duplicate xs (n-1)

Ответ 5

Опять попытка начинающих, используя рекурсию

duplicate s n = if n <= 1 then s else duplicate (n-1) s ++ s

хотя немного непонятно, что должна делать функция, если n отрицательно или равно нулю. Поэтому я решил вернуть строку.