Тут всё понятно:
Гипотеза: любое чётное (>2) представимо как сумма двух простых.
Берём список нечётных (простые всегда нечётные, кроме 2): [ 3, 5 ..]. Это будет первым слагаемым. Если искомое число a, то второе слагаемое a-c (c - первое слагаемое). Ясно, что список первого слагаемого можно ограничить a `div` 2, т.е. получаем [3,5..a `div` 2].
Дальше фунция map, получая каждый элемент списка (c) формирует пару слагаемых: с - первое, a-c - второе.
Это мы описали map (\c -> (c, a - c)) [3,5..a `div` 2]
Напр., для 10 получим список [(3,7), (5,5)].
Из этого списка надо выкинуть пары, где есть непростые (составные) числа. Напр., для 12 список [(3,9), (5,7)] первая пара выкинется (фильтром), т.к. 9 - составное (делится на 3).
Если в результирующем списке несколько пар, то func1 просто берёт первую (напр., для 10 будет пара (3,7)). func1 это стандартная функция head.
Ну и вспомогательные функции: isPr - проверка на простое число, isFactor - на составное.
Не совсем оно красивое и элегантное, т.к. func1 лишняя, есть стандартная функция lenght (в самом Haskell она реализована более оптимально, поэтому тут уже о красоте можно не рассуждать).
func2 действительно никем не вызывается, поэтому лишняя. Видимо, потом автор кода понял, что и тут можно вызвать стандартную функцию drop (выкинуть n первых элементов).
Некит Медведев, размеры сейчас довольно миниатюрные. А что касается цены, то я, напр., не понимаю, когда за телефон отдают 20 - 50 тысяч, чтобы потом долбить пальцем как дятел в каких-то играх.
Нет, обработка идёт одной командой (сразу четыре 32-битных float) как на x86, так и на х64 платформах. Главное, чтобы была поддержка SSE2-набора команд.
Работа с GPU зависит от библиотеки. Можно использовать C++ (DirectX), можно Matlab (он использует nVidia). У самой nVidia несколько библиотек. Ну и всякие прочие для машинного обучения, включая Питон.
Ещё есть матрицы XMMATRIX (это 4 вектора), а для хранения используются структуры типа XMFLOAT. Для преобразования используются функции типа load и store.