Повернуть список в Haskell

Я удалил set smartindent из ~/.vimrc, но он все еще не отключил smartindent. Когда я открыл файл .py и запустил :set smartindent?, он отобразил smartindent.

Оказывается, что далее в ~/.vimrc была следующая строка:

autocmd BufRead *.py set smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class
                         ^^^^^^^^^^^

Once Я удалил «smartindent» из этой строки, после чего smartindent был окончательно отключен, и мои комментарии снова были отложены.

23
задан hammar 5 May 2013 в 16:05
поделиться

8 ответов

Для полноты картины, версия, которая работает как с пустыми, так и с бесконечными списками.

rotate :: Int -> [a] -> [a]
rotate _ [] = []
rotate n xs = zipWith const (drop n (cycle xs)) xs

Затем

Prelude> rotate 2 [1..5]
[3,4,5,1,2]
60
ответ дан dave4420 5 May 2013 в 16:05
поделиться

Простое решение с использованием функции cycle, которая создает бесконечное повторение списка ввода:

rotate :: Int -> [a] -> [a]
rotate n xs = take (length xs) (drop n (cycle xs))

, затем

> rotate 2 ["#","@","#","#"]
["#","#","#","@"].
25
ответ дан MGwynne 5 May 2013 в 16:05
поделиться

Зачем усложнять?

rotate n xs = bs ++ as where (as, bs) = splitAt n xs
17
ответ дан augustss 5 May 2013 в 16:05
поделиться

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

rotate :: Int -> [a] -> [a]
rotate n xs = take lxs . drop (n `mod` lxs) . cycle $ xs where lxs = length xs

Таким образом, rotate (-1) [1,2,3,4] дает вам тот же результат, что и rotate 3 [1,2,3,4].

Я подумал, что должен был добавить это, потому что drop ping меньше 0 элементов ничего не делает, поэтому мой предпочтительный ответ дает «неправильные» (по крайней мере, сбивающие с толку) результаты с отрицательными значениями для параметра n.

Интересной частью этого решения является то, что оно сочетает в себе «полноту» для отрицательных вращений с обработкой пустых списков. Благодаря лени Хаскелла, он также дает правильные результаты для rotate 0 [].

4
ответ дан Wolf 5 May 2013 в 16:05
поделиться

Попытка новичка:

myRotate :: Int -> [String] -> [String]
myRotate 0 xs = xs
myRotate n xs = myRotate (n-1) (last xs : init xs)
2
ответ дан 7stud 5 May 2013 в 16:05
поделиться

Не очень быстро для больших списков, но достаточно:

rotate :: Int -> [a] -> [a]
rotate n xs = iterate rot xs !! n
  where
    rot xs = last xs : init xs

Например:

> rotate 2 ["#","@","#","#"]
["#","#","#","@"]
1
ответ дан Stefan Holdermans 5 May 2013 в 16:05
поделиться
rotate :: Int -> [a] -> [a]
rotate n xs = drop k xs ++ take k xs
                where k = length xs - n

Эта функция поворачивается на n мест вправо.

0
ответ дан smilingbuddha 5 May 2013 в 16:05
поделиться
rotate :: Int -> [a] -> [a]
rotate = drop <> take
0
ответ дан aztek 5 May 2013 в 16:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: