oczywiście wytwarzania iloczyn kartezjański heterogenicznych listach mogą być wykonane w różnych sposób w Haskell, takich jak:iloczyn kartezjański heterogenicznych list
[(x,y) | x <- [1,2,3], y <- [4,5,6]]
lub
(,) <$> [1,2,3] <*> [4,5,6]
ale co ja chce się funkcję tak:
heteroCartesian ::
(a1, a2, ... , an) ->
(b1, b2, ... , bn) ->
((a1,b1), (a1,b2), ... , (a1,bn), (a2,b1), (a2,b2), ... , (a2,bn), (an,b1), ... ,(an,b2), ... , (an,bn))
Więc mogę zrobić coś takiego:
Nie mam nic przeciwko używaniu krotek lub czegoś innego, ale muszę zachować informacje o typie, takie jak powyżej.
Powodem, dla którego tego chcę, jest tworzenie przypadków testowych. Mam wiele funkcji powiedzieć n
i wartości m
. Ostatecznie zamapuję funkcję nad tymi, która redukuje je wszystkie do tego samego typu (Test
), ale do tego momentu istnieje kilka różnych typów testów testowych, które chcę wykonać (nie jest to tak proste, ponieważ niektóre funkcje mogą tylko podjąć ograniczone podzbiory wartości).
Tak więc naturalnie dobrze byłoby mieć inne funkcje na tych heterogenicznych listach, na przykład na przykład w rodzaju map
.
Spojrzałem na HList, ale nie został zaktualizowany w zeszłym roku i nieco, i nie byłem pewien, czy to było najbardziej odpowiednie narzędzie w każdym razie.
Zauważ, że to dno dość szybko - Krotki GHC są ograniczone do [62 elementów] (https://github.com/ghc/ghc/blob/master/libraries/ghc-prim/GHC/Tuple.hs # L167-L168) (jeśli policzę poprawnie). – Alec
@Alec: tak, chciałem tylko dostarczyć rozwiązanie, które używa wbudowanych typów Haskella. –