Преобразование рекурсии в понимание списка - PullRequest
1 голос
/ 09 октября 2019

У меня есть эта функция:

subsetsOfThree [] = []
subsetsOfThree [x,y,z] = [[x,y,z]]
subsetsOfThree fls@(x:y:z:xs) = ([x,y,z] : subsetsOfThree (xs))  ++ 
  (subsetsOfThree (x:xs)) ++
  (subsetsOfThree (y:xs)) ++ 
  (subsetsOfThree (z:xs)) ++ 
  (subsetsOfThree (x:y:xs)) ++
  (subsetsOfThree (x:z:xs)) ++ 
  (subsetsOfThree (y:z:xs)) 
subsetsOfThree _ = []

И для этого нужны только подмножества длины 3, но я не могу избавиться от преобразования в эквивалентное понимание списка, я попытался:

subsetsOfThree [] = []
subsetsOfThree [x,y,z] = [[x,y,z]]
subsetsOfThree (x:y:z:xs) = [xs6 | xs1 <- subsetsOfThree xs,
 xs2 <- [xs1, (x:xs)],
 xs3 <- [xs2, (y:xs)],
 xs4 <- [xs3, (z:xs)],
 xs5 <- [xs4, (x:y:xs)],
 xs6 <- [xs5, (y:z:xs)]
 ]
subsetsOfThree _ = [] 

Но всегда возвращается []

Любая подсказка будет оценена

1 Ответ

4 голосов
/ 09 октября 2019

Я думаю, что вы, возможно, захотите использовать вспомогательную функцию tails:

subsetsOfThree ws = [ [x,y,z] | (x:xs) <- tails ws, (y:ys) <- tails xs, z <- ys ]

Это основано на (_:_) <- list, не генерирующем ничего, когда list пуст, вместо того, чтобы выдавать ошибку времени выполнения.

...