Я работаю над назначением uni для реализации левого внешнего соединения в Haskell, используя только определения функции прелюдии. Я попытался с помощью списковых:Haskell Выполнение левого внешнего соединения
ljoin :: Eq a => [(a,b)] -> [(a,c)] -> [(a,b, Maybe c)]
ljoin xs ys = [if x1 == y1 then (x1,x2, Just y2) else (x1,x2, Nothing)| (x1, x2) <- xs, (y1,y2) <- ys]
Это производит следующий вывод для примера:
Main> ljoin [(2,"S"),(1,"J")] [(2,1),(2,2),(3,4)]
[(2,"S",Just 1),(2,"S",Just 2),(2,"S",Nothing),(1,"J",Nothing),(1,"J",Nothing),(1,"J",Nothing)]
(399 reductions, 834 cells)
ли кто-нибудь может дать мне какие-либо советы, чтобы избавиться от дублирующих записей в результате? (2, «S», «Ничто») не должно быть в результатах и должно присутствовать только 1 из (1, «J», «Нет»).
Заранее благодарен.
Попробуйте предварительно отсортировать оба списка. Таким образом, вам не требуется понимание списка для сканирования всех комбинаций значений O (n^2), но вы можете продолжить рекурсию. – chi
Почему у вас есть записи с Ничто? Что они имеют в виду? –
Уточнение, выше, это главный вопрос. –