Обратите внимание, что это так уродливо, потому что есть два способа сделать список Аппликативным Functor. Первый (и IMHO менее полезный) способ состоит в том, чтобы взять все комбинации, и таким образом стал "стандартным", поэтому (+) <$> [1,2] <*> [30,40] - [31,41,32,42]. Другим способом является zip-списки, которые нам нужны здесь, но поскольку у вас может быть только один экземпляр класса типа для каждого типа, мы должны обернуть списки в ZipLists и развернуть результат с помощью getZipList.