Как реализовать в конечном итоге повторяющийся список в Haskell? - PullRequest
0 голосов
/ 03 мая 2018

Я могу видеть, как цикл может использоваться для реализации повторяющегося списка (например, [0,9,0,9, ...], десятичное расширение 10/11), но как можно один реализует тот, у которого есть несколько начальных элементов, прежде чем он успокаивается до повторяющегося шаблона (например, [3,1,4,2,8,5,7,1,4,2,8,5,7, ...], десятичное расширение 22/7)? Мне бы хотелось, чтобы такая структура хорошо работала со складками и т. Д.

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

Mathematica реализует повторяющиеся дроби ( RealDigits и FromDigits ) и повторяющиеся непрерывные дроби ( ContinuedFraction и FromContinuedFraction ):

ContinuedFraction[Sqrt[13]] = {3,{1,1,1,1,6}}

и

RealDigits[22/7] = {{3,{1,2,8,5,7}},1}

Похожий вопрос здесь: https://mathematica.stackexchange.com/questions/21998/building-a-continued-fraction но результаты кажутся очень неожиданными, и я надеюсь на что-то более чистое в Haskell.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Это более общая функция. Это займет любое действительное число из любой функции. Это, конечно, только две части. Я уверен, что вы можете сделать лучше. Это просто стартер. Я использую show для обработки числа как строки, потому что Haskell очень требователен к смешиванию плавающих / не плавающих типов.

c2l d = splitAt 1 [read [u] :: Int| u<-(tail.tail.show $ d/10)]

Выполнить как

c2l (22/7)

([3], [1,4,2,8,5,7,1,4,2,8,5,7,1,4,3])

Или

c2l (sqrt 13)

([3], [6,0,5,5,5,1,2,7,5,4,6,3,9,8,9])

Кроме того, библиотека Haskell Math является самой замечательной. Существует компьютерная алгебра, точки фиксации, теория множеств, анализ, линейная алгебра (!) И абстрактная алгебра.

Возьмите splitAt 1, чтобы получить только линейный список.

0 голосов
/ 03 мая 2018

Почему бы просто не добавить что-нибудь к результату cycle?

3 : cycle [1, 4, 2, 8, 5, 7]

Принимая во внимание, что «круговой» связанный список - это тот, где хвост указывает назад на голову, это связанный список с циклом, который указывает на середину списка, например:

let x = [1, 4, 2, 8, 5, 7] ++ x in 3 : x
3 : (let x = 1 : 4 : 2 : 8 : 5 : 7 : x in x)
...