Имитация цикла for в haskell - PullRequest
0 голосов
/ 17 марта 2012

В настоящее время я пишу дипломную работу бакалавра по CS для обучения в Австрии.

Я использую язык программирования Haskell.

Теперь я пытаюсь найти способ исправить мою следующую проблему: у меня есть список кортежей, скажем, [(1,2),(2,3)].Из этого списка кортежей я бы сейчас хотел выбрать каждый из этих кортежей и затем выполнить с ним операцию: Map.insert (1,2) XXX ftable, где (1,2) - первый элемент этого списка, XXX - некоторое значение и ftable.моя карта

Как я могу «перебрать» этот список и продолжить эту операцию, вставляя «n-й» элемент моего списка в мою карту?

Полагаю, я слишком хорошо знаком с императивом программирования и не могу найти способ исправить это в Haskell.

Ответы [ 4 ]

5 голосов
/ 17 марта 2012

Не совсем понятно, что вы здесь имеете в виду.Правильно ли предположить, что кортежи предназначены для представления ключей на вашей карте, а XXX - это какое-то значение, присвоенное определенному ключу?Все ли значения, которые вы хотите сопоставить с данным ключом, также представлены в списке?В этом случае вы можете легко использовать функцию fromList в Data.Map:

keys = [(1,2),(2,3),(7,9)]
values = ["A","B","C"]

map = Data.Map.fromList $ zip keys values
3 голосов
/ 17 марта 2012

Подумайте о том, что делает ваш цикл.

  • если он преобразует каждый элемент списка, тогда используйте map (или concatMap)
  • если он отфильтровывает некоторые элементы списка, тогда используйте filter
  • , если список сводится к итоговому значению, используйте сгиб (например, foldl, foldr; более конкретные сгибы: sum, and и т. Д.)
  • или, если выполняется какая-то комбинация из вышеперечисленных, используйте комбинацию из вышеперечисленных функций

В вашем случае, я не совсем уверен, что вы хотите, но я думаю, что вы хотите получить один Map, поэтому вы хотите свернуть свой список. Возможно что-то вроде

foldl (\oldMap key -> Map.insert key xxx oldMap) ftable yourListOfTuples
1 голос
/ 17 марта 2012

Создание предложения Хакоджи ...

Вероятно, что XXX в этот момент является либо 1) постоянным для каждой клавиши, либо 2) некоторой функцией, основанной на клавише, либо 3) каким-то образом определенным параллельно клавише.

1) константа ххх для каждого ключа

keys = [(1,2),(2,3),(7,9)]
xxx = "A"

ftable = Data.Map.fromList $ zip keys (repeat xxx)

2) функция выдает значение на основе ключа

keys = [(1,2),(2,3),(7,9)]
f = ...

ftable = Data.Map.fromList $ zip keys (map f keys)

3) xxx определено параллельно: используйте предложение hakoja

1 голос
/ 17 марта 2012

У вас есть несколько вариантов итерации по спискам, каждый из которых выбирается в зависимости от эффекта, который вы ищете:

  • складывает , они полезны для многих вычисленийв списках.Они могут также быть тем, что вы ищете, но я не понимаю из вашего вопроса вашу конкретную проблему.
  • map , которая применяет одну и ту же (данную) функцию к каждому элементувходной список, возвращающий список результатов.Есть также варианты, которые работают в монадических вычислениях .
  • или, если это лучше всего соответствует вашим потребностям, вы всегда можете написать свою собственную хвостовую рекурсивную функцию: haskell будет обрабатыватьони так же, как для циклов, без использования кучи (но, пожалуйста, посмотрите справочную ссылку для хорошего объяснения техники).

В конце концов, какую бы функцию или технику вы ни использовали, она будетоснованный на рекурсии, поскольку функциональные языки, такие как Haskell, не допускают циклы for в той форме, к которой вы привыкли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...