Для того чтобы сделать функцию полиморфной, вам нужно указать переменную типа в подписи функции. Переменные типа должны быть указаны в нижнем регистре, чтобы отличать их от конкретных типов, которые указаны в верхнем регистре.
divide_list :: a -> [a] -> [a] -> [a] -> ([a], [a])
Цитата Нежное Введение в Haskell учебник:
Haskell также включает в себя полиморфные типы --- типы, которые повсеместно количественно определенным образом по всем типам. Полиморфный тип выражений существенно описывает семейства типов. Например, (forall a) [a] - это семейство типов, состоящих из каждого типа a, типа списков a. Списки целых чисел (например, [1,2,3]), списки из символов (['a', 'b', 'c']), даже списки списков целых чисел и т. Д. - это все члены этого семьи.
EDIT после вопроса в комментарии:
Обратите внимание, что в определении функции вы используете <=
. Это функция, определенная в классе Ord
, поэтому вам необходимо ограничить полиморфный тип экземпляром этого класса.
divide_list :: (Ord a) => a -> [a] -> [a] -> [a] -> ([a], [a])
Одно простое решение состоит в оценке функции без сигнатуры типа, и пусть ghci вывести тип для вас. Он должен обобщать 'Int' на' Ord a => a'. – zakyggaps
Что значит: «Ord a => a»? – Gilgamesz
Это любой тип 'a' с экземпляром' Ord'. Это необходимо для использования '<=' в вашей функции. – zakyggaps