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