Простое решение. Обратите внимание, что средний элемент будет пропущен, если список имеет нечетную длину.
import Data.List(sort)
fun :: Ord a => [a] -> [(a, a)]
fun l =
let x = sort l
in take (length l `div` 2) (zip x (reverse x))
Сначала мы отсортируем l
в порядке возрастания. Поэтому, учитывая ваш пример [3,6,1,8,7,9,12,4]
:
x == [1,3,4,6,7,8,9,12]
Мы zip
x
с обратным x
:
zip x (reverse x) == [(1,12),(3,9),(4,8),(6,7),(7,6),(8,4),(9,3),(12,1)]
И затем мы берем первую половину элементов, что is length l `div` 2
:
take (length l `div` 2) (zip x (reverse x))
== [(1,12),(3,9),(4,8),(6,7)]