Zawsze uważałem, że nie pasuje do funkcji lub wyrażenia, które wymaga użycia wartości, a także indeksów, listy (lub tablicy, stosuje się tak samo) w Haskell.Używanie elementów listy i indeksów razem
pisałem validQueens
poniżej podczas eksperymentowania z problemem N-królowych here ...
validQueens x =
and [abs (x!!i - x!!j) /= j-i | i<-[0..length x - 2], j<-[i+1..length x - 1]]
nie dbałem za korzystanie z indeksowaniem, wszystko plus i minusy, itd. Wydaje się niechlujstwa. Wpadłem poniżej:
enumerate x = zip [0..length x - 1] x
validQueens' :: [Int] -> Bool
validQueens' x = and [abs (snd j - snd i) /= fst j - fst i | i<-l, j<-l, fst j > fst i]
where l = enumerate x
inspirowana przez enumerate
Pythona (nie że pożyczkowe nadrzędnymi pojęć zawsze jest dobrym pomysłem). Wygląda na to, że jest lepszy, ale w każdym miejscu jest trochę sroga. Jest to również, przynajmniej na pierwszy rzut oka, droższe zarówno w czasie, jak i przestrzeni. Nie jestem pewien, czy mi się to podoba, czy nie.
Tak w skrócie, nie jestem naprawdę zadowolony z obu
- iteracji thru indeksem ograniczonym długości, lub nawet gorzej, off-by-jedynek i dwójek
- Index-element krotki
Czy ktoś znalazł wzór, który jest bardziej elegancki niż któryś z powyższych? Jeśli nie, czy istnieje jakiś ważny powód, dla którego jedna z powyższych metod jest lepsza?