Пытаюсь работать как с моими настоящими «рабочими» репозиториями, так и с моими личными репозиториями на git hub, с моего компьютера.
Сначала была создана рабочая учетная запись, и все работает
Моя личная учетная запись, однако, не может подтолкнуть к моему личному репо, sparse1, sparse2 :: M.Map Int Float sparse1 = M.fromList [(1,2.0), (10,3), (12,5), (100,7), (102,11)] sparse2 = M.fromList [(2,13.0), (11,17), (12,19), (101,23), ...
Предположим, 2 карты
import qualified Data.Map as M
sparse1, sparse2 :: M.Map Int Float
sparse1 = M.fromList [(1,2.0),(10,3),(12,5),(100,7),(102,11)]
sparse2 = M.fromList [(2,13.0),(11,17),(12,19),(101,23),(102,29)]
Как вы определяете элегантную функцию
combi :: M.Map Int Float -> M.Map Int Float -> Float
, так что combi sparse1 sparse2 возвращает 414.0 (= 5 * 19 + 11 * 29), потому что 12 и 102 являются единственными общими ключами двух карт? Существует элегантная (простая и эффективная) функция со списками, поскольку они будут строго упорядочены:
combiList xs ys = cL xs ys 0
cL [] _ acc = acc
cL _ [] acc = acc
cL (x@(k,r):xs) (y@(k',r'):ys) acc
| k < k' = cL xs (y:ys) acc
| k == k' = cL xs ys (acc+r*r')
| k > k' = cL (x:xs) ys acc
Но
combi m1 m2 = combiList (M.toList m1) (M.toList m2)
хорошая ли идея знать, что списки больше не используются в остальной части кода? А если нет, как бы вы эффективно написали комби без toList?