Я пытаюсь написать функцию, которая принимает String
и Int
, и возвращает эту строку "int". То есть:
duplicate :: String -> Int -> String
Если я должен был написать duplicate "Hello" 3
, вывод должен быть "HelloHelloHello"
.
Я пытаюсь написать функцию, которая принимает String
и Int
, и возвращает эту строку "int". То есть:
duplicate :: String -> Int -> String
Если я должен был написать duplicate "Hello" 3
, вывод должен быть "HelloHelloHello"
.
Легко:
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)
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
Вы можете использовать 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
.
Вы можете использовать сопоставление образцов.
duplicate _ 0 = []
duplicate xs n = xs ++ duplicate xs (n-1)
или
duplicate xs n | n==0 = []
| otherwise = xs ++ duplicate xs (n-1)
Опять попытка начинающих, используя рекурсию
duplicate s n = if n <= 1 then s else duplicate (n-1) s ++ s
хотя немного непонятно, что должна делать функция, если n отрицательно или равно нулю. Поэтому я решил вернуть строку.