2013-05-14 3 views
1

Я пытаюсь обернуть голову вокруг дженериков в Haskell. Моя проблема в том, что я создал функцию concatenate, которая принимает список строк и возвращает гигантскую строку.Как использовать generics в Haskell

concatenate:: [String] -> String 
concatenate xs = foldl (\acc x -> acC++ x) [] xs 

Но теперь я бы хотел вместо списка строк использовать список чего угодно. Это могут быть строки, могут быть ints. Так сказать

concatenate ["Phil", "is"] 

генерирует "Philis", а

concatenate [[1,2],[3,4]] 

генерирует [1,2,3,4].

Я обнаружил, что

concatenate:: [a] -> a 
concatenate xs = foldl (\acc x -> acC++ x) [] xs 

не работает, и я не знаю, почему. Разве это не так, как работает haskell, независимо от того, какой тип a есть, и выход тоже? Или проблема со второй половиной не позволяет ей работать как функция для всех типов?

+0

Когда вы не знаете, почему (и когда вы просите о помощи на SO), лучше читать и передать сообщение об ошибке, которое ясно говорит, что есть тип ошибки. –

+0

О! Извините, сообщение об ошибке читается: 'Происходит проверка: не может построить бесконечный тип: a0 = [a0] В первом аргументе '(++)', а именно 'acc' В выражении: acc + + x В первом аргументе 'foldl', а именно '(\ acc x -> acC++ x)' ' Это после того, как я заменил [a] на [[a]] с помощью @ Полезный лакомый кусочек Pubby на String. Он пытается сказать, что ++ не будет работать с типом a? Или что он слишком общий, а ++ работает только со списками? Я немного смущен. – Phirip

+0

С исправлением Pubby на подпись типа ваш код в порядке. Если вы все еще получаете ошибки, вы используете сломанную настройку или вы сделали некоторые другие изменения. Не помните ли вы изменить RESULT 'a' на' [a] ', как указал Pubby? –

ответ

5

Имейте в виду, что String является псевдонимом для [Char].

То, что вы на самом деле предназначен был такой:

concatenate:: [[a]] -> [a] 
Смежные вопросы