Использование переменных внутри функций

Скажем, у меня есть тип данных под названием «Координация», который определен как таковой:

type Coord a = [(Int, Int)]

Я хочу создать переменную типа "Coord" для использования в моей функции ниже. Функция принимает переменную типа Coord и умножает координату x каждого элемента в списке на 2. Затем она сохраняет каждую из этих новых координат в НОВОЙ переменной Coord; Я не уверен, как создать/объявить/использовать эту новую переменную, которую я хочу вернуть.

foo :: (Eq a) => Coord a -> Coord a

Как вы создали свою первую переменную Coord?

that other guy 12.04.2019 22:47

Разве это не должно быть type Coord a = [(a, a)]? Или newtype Coord a = Coord [(a, a)].

Willem Van Onsem 12.04.2019 22:50

@тот другой парень, которого я вызываю, используя первую координату; например, в моем вызове функции я бы набрал «foo (1,2)»

Darrel Gulseth 12.04.2019 22:52

@WillemVanOnsem Ну, если бы я принял любой тип в своих координатах, тогда да, но мне нужны только целые числа; например, мне нужны только (1,2), (23, 12), (0, 1) и т. д., а не любой другой тип.

Darrel Gulseth 12.04.2019 22:52

@DarrelGulseth В вашем сообщении говорится, что вы определили Coord как список. У вас действительно есть type Coord = (Int, Int) вместо этого? Или ты бежишь foo [(1,2)]? Если вы еще не пробовали запустить его, сделайте это и сначала разберитесь с этим (вы можете использовать foo = undefined, пока не поймете, что с ним делать).

that other guy 12.04.2019 22:54

@DarrelGulseth: но тогда я не понимаю, почему (а) вы все равно используете параметр типа a, поскольку он не используется в «теле» предложения type, и (б) почему вы добавляете ограничение Eq.

Willem Van Onsem 12.04.2019 22:57

@тот другой парень Да, я хотел ввести foo [(1,2)]

Darrel Gulseth 12.04.2019 23:03

@Willem Van Onsem Хорошо, я изменю эти два, так как они не нужны.

Darrel Gulseth 12.04.2019 23:04

Знали бы вы, как это сделать, если бы у вас был [(Int, Int)] вместо Coord?

that other guy 12.04.2019 23:05

@тот другой парень Нет, я бы не стал; Я не знаю, как объявить этот список, понимаете? Поэтому мне нужно было бы создать новый список [(Int, Int)]. Но как мне это сделать? Я знаю только, как получить доступ к тому, что мне дали в качестве параметра.

Darrel Gulseth 12.04.2019 23:10

@DarrelGulseth «Ну, если бы я принял любой тип в своих координатах, тогда да, но мне нужны только целые числа». Тогда вам не нужен a. Должно быть type Coord = [(Int, Int)]

DarthFennec 12.04.2019 23:12

@DarthFennec Но это то, что у меня есть, верно?

Darrel Gulseth 12.04.2019 23:16

@DarrelGulseth Понятно type Coord a = [(Int, Int)]. Там есть a, который не делает для вас ничего полезного, если только вы не принимаете какой-либо тип.

DarthFennec 12.04.2019 23:18
Что такое компоненты React? Введение в компоненты | Типы компонентов
Что такое компоненты React? Введение в компоненты | Типы компонентов
Компонент - это независимый, многократно используемый фрагмент кода, который делит пользовательский интерфейс на более мелкие части. Например, если мы...
2
13
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это был бы ручной способ сделать что-то с каждым элементом в списке:

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).

Robin Zigmond 12.04.2019 23:42

Другие вопросы по теме