2015-10-24 2 views
1

Я должен использовать функцию репликации, которую Haskell имеет (replicate 3 'x' = ['x','x','x']), но я пытаюсь добавить ее в список, который уже существует.Использование функции репликации в haskell для добавления в список

Prelude > let k = ['d','f','g'] 
Prelude > (replicate 3 'd':k) 

, но я получаю ошибку,

Couldn't match type 'Char' with '[Char]' 
Expected type: [[Char]] 
Actual type: [Char] 

Есть ли способ сделать это?

ответ

4

k и replicate 3 'd' каждый имеет тип [Char].

ghci> :t k 
k :: [Char] 

ghci> :t replicate 3 'd' 
replicate 3 'd' :: [Char] 

Однако тип (:) является a -> [a] -> [a]: он принимает один a и добавляет его в список a с.

ghci> :t (:) 
(:) :: a -> [a] -> [a] 

Так Хаскеля дает вам тип ошибки, потому что вы не можете применить (:) на две вещи типа [Char]. Другими словами, вы не можете поставить [Char] внутри [Char].

Нам действительно нужна функция типа [a] -> [a] -> [a], которая объединяет два списка. Бывает, что эта функция называется (++).

ghci> :t (++) 
(++) :: [a] -> [a] -> [a] 

ghci> replicate 3 'd' ++ k 
"ddddfg" 
Смежные вопросы