что делает эта функция в Haskell?

#haskell

#haskell

Вопрос:

что делает эта функция в Haskel?

Я не понимаю, как здесь работает рекурсия

  f[]=[]
 f(x:xs)=x: [y|y <- f xs, x/=y]
  

Комментарии:

1. Вы пробовали ее запускать? Что именно в рекурсии вы не понимаете?

Ответ №1:

 f[]=[]
f(x:xs) = x : [y|y <- f xs, x/=y]
  

Эта функция удаляет дубликаты из списка. Вот как это работает:

  • В базовом случае список пуст, поэтому он возвращает пустой список.
  • В противном случае вы берете первый элемент x и предполагаете (индуктивная гипотеза), который f xs дает вам список без дубликатов. Теперь единственное, что вам нужно сделать, это убедиться, что вы не вставляете x снова. Итак, сжатие списка означает: возьмите все остальные элементы (которые по индуктивной гипотезе уникальны), но удалите x .

Чувствует ли это прямо сейчас?

ps. вы можете записать второе предложение также как: f(x:xs) = x : filter (/= x) (f xs)

Комментарии:

1. Вы можете переписать все определение как: f = foldr (x -> (x :) . filter (/= x)) []

Ответ №2:

Мне кажется, что это устраняет любые повторяющиеся записи в списке.

Вот как это работает:

f[] = [] означает, что, когда вход представляет собой пустой список, на выходе будет пустой список.
Затем f(x:xs) = x: [y|y <- f xs, x/=y] использует то, что называется пониманием списка. Он берет начало входного списка, а затем добавляет понимание списка.

Понимание списка выглядит следующим образом: «y такое, что y находится в f (xs), а y не равно x»

Итак, это список элементов в f(xs), которые не равны элементу head .

Комментарии:

1. Я запускаю f[1,2,3,4,12,3,1,2,1,4] и получаю список без дубликатов… но я не понял, как это работает..

2. Нет, вы не можете; это просто дало бы вам список элементов, в которых самый первый элемент не повторяется. Итак, f([1, 1, 2, 2]) вернул бы [1, 2, 2].