Скажем, у меня есть тип данных под названием «Координация», который определен как таковой:
type Coord a = [(Int, Int)]
Я хочу создать переменную типа "Coord" для использования в моей функции ниже. Функция принимает переменную типа Coord и умножает координату x каждого элемента в списке на 2. Затем она сохраняет каждую из этих новых координат в НОВОЙ переменной Coord; Я не уверен, как создать/объявить/использовать эту новую переменную, которую я хочу вернуть.
foo :: (Eq a) => Coord a -> Coord a
Разве это не должно быть type Coord a = [(a, a)]? Или newtype Coord a = Coord [(a, a)].
@тот другой парень, которого я вызываю, используя первую координату; например, в моем вызове функции я бы набрал «foo (1,2)»
@WillemVanOnsem Ну, если бы я принял любой тип в своих координатах, тогда да, но мне нужны только целые числа; например, мне нужны только (1,2), (23, 12), (0, 1) и т. д., а не любой другой тип.
@DarrelGulseth В вашем сообщении говорится, что вы определили Coord как список. У вас действительно есть type Coord = (Int, Int) вместо этого? Или ты бежишь foo [(1,2)]? Если вы еще не пробовали запустить его, сделайте это и сначала разберитесь с этим (вы можете использовать foo = undefined, пока не поймете, что с ним делать).
@DarrelGulseth: но тогда я не понимаю, почему (а) вы все равно используете параметр типа a, поскольку он не используется в «теле» предложения type, и (б) почему вы добавляете ограничение Eq.
@тот другой парень Да, я хотел ввести foo [(1,2)]
@Willem Van Onsem Хорошо, я изменю эти два, так как они не нужны.
Знали бы вы, как это сделать, если бы у вас был [(Int, Int)] вместо Coord?
@тот другой парень Нет, я бы не стал; Я не знаю, как объявить этот список, понимаете? Поэтому мне нужно было бы создать новый список [(Int, Int)]. Но как мне это сделать? Я знаю только, как получить доступ к тому, что мне дали в качестве параметра.
@DarrelGulseth «Ну, если бы я принял любой тип в своих координатах, тогда да, но мне нужны только целые числа». Тогда вам не нужен a. Должно быть type Coord = [(Int, Int)]
@DarthFennec Но это то, что у меня есть, верно?
@DarrelGulseth Понятно type Coord a = [(Int, Int)]. Там есть a, который не делает для вас ничего полезного, если только вы не принимаете какой-либо тип.

Это был бы ручной способ сделать что-то с каждым элементом в списке:
type Coord = [(Int, Int)]
multiplyXBy2 :: Coord -> Coord
multiplyXBy2 [] = []
multiplyXBy2 ((x, y):rest) = (x*2, y) : multiplyXBy2 rest
Вот вызов через ghci:
*Main> multiplyXBy2 [(1,2), (3,4)]
[(2,2),(6,4)]
Для самых основ использования языка, например, как получить доступ к элементам списка, переданным в функцию, или как программно создать список, рассмотрите возможность использования учебника, такого как Синтаксис в функциях LYAH или Определение типов, оптимизация функций RWH.
Возможно, более «продвинутый» (хотя и не совсем), но вы можете значительно упростить это, определив его как multiplyXBy2 = map (\(x, y) -> (2*x, y)). Или даже multiplyXBy2 = (map . first) (*2) (если вы import Control.Arrow).
Как вы создали свою первую переменную Coord?