Изо всех сил, чтобы извлечь раздел списка в Haskell - PullRequest
3 голосов
/ 17 марта 2020

Я пытаюсь реализовать базовую c функцию, но я не практикую с Haskell и пытаюсь изо всех сил, поэтому буду очень признателен за некоторую помощь. Мой вопрос конкретно, как выбрать раздел списка по индексу . Я знаю как на других языках, но боролся

[ x | x <- graph,  x!! > 5 && x!! <10 ]

Я возился с базовым пониманием списка c, похожим на то, что описано выше, и хотя я знаю, что это неправильно, я надеялся аналогично простое решение будет доступно. Если кто-то хочет получить дополнительную информацию или хочет помочь с дальнейшим вопросом, я включил дополнительную информацию ниже, спасибо!

type Node = Int
type Branch = [Node]
type Graph= [Node]

next :: Branch -> Graph ->  [Branch]

Это отдельный вопрос для функции "next"

Это общая информация о настройке, но наиболее важно то, что график представлен в виде сплющенной матрицы смежности c

Извинения за две картинки, но это кажется лучшим способом передать информацию.

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Как указано в комментариях !! не дает вам индекс значения так, как вы ожидаете. Это просто инфикс для получения элемента списка.

Невозможно получить индекс x, как этот, в Haskell, поскольку объект x не отслеживает, где это так.

Чтобы исправить это, мы можем составить список объектов, которые do отслеживают, где они были. Это может быть достигнуто с помощью zip.

zip [0..] graph

. Создается список кортежей, каждый из которых содержит свой индекс и значение в graph.

можете написать ваш список пониманий как

[ x | (index, x) <- zip [0..] graph, index > 5, index < 10 ]

Теперь это будет не очень быстро, так как все равно нужно go пройти через каждый элемент списка, несмотря на тот факт, что мы не знаем ни одного элемента после 11-го использоваться. Для скорости мы хотели бы использовать комбинацию take и drop.

drop 5 (take 10 graph)

Однако, если мы хотим сделать некоторые другие выборы (например, все четные индексы), мы все еще можем go вернуться к пониманию списка.

0 голосов
/ 18 марта 2020

В этом случае вы могли бы drop 5 <&> take 4. Как в drop 5 x & take 4. При отбрасывании пропускаются первые несколько элементов и удаляются все, кроме первых нескольких, оставшихся после отбрасывания.

...