/ / Dlaczego otrzymuję komunikat "Exception: Prelude.head: empty list"? - lista, haskell, macierz, dopasowywanie wzorców

Dlaczego otrzymuję komunikat "Exception: Prelude.head: empty list"? - lista, haskell, macierz, dopasowywanie wzorców

Nie mogę zrozumieć, dlaczego dopasowanie wzoru nie działa! Zaczynam od Hasklella, więc bądź cierpliwy!

-- matrix implemented as a list of lists (rows of the matrix)
test_matrix3 = [[1,0,0],[2,-3,0],[4,5,6]]

-- transpose of a given matrix
transpose    (x:[]) = [x]
transpose all@(x:_) = map head all : transpose ([tail y | y <- all])

Wykonywanie:

*Main> transpose test_matrix3
[[1,2,4],[0,-3,5],[0,0,6],[*** Exception: Prelude.head: empty list

Odpowiedzi:

2 dla odpowiedzi № 1

Ten pracował dla mnie:

transpose" ([]:_) = []
transpose" xs = (map head xs) : (transpose" (map tail xs))

Test:

*Main> transpose" test_matrix3
[[1,2,4],[0,-3,5],[0,0,6]]

6 dla odpowiedzi nr 2
  transpose [[1,0,0],[2,-3,0],[4,5,6]]
= [1,2,4] : transpose [[0,0],[-3,0],[5,6]]
= [1,2,4] : [0,-3,5] : transpose [[0],[0],[6]]
= [1,2,4] : [0,-3,5] : [0,0,0] : transpose [[],[],[]]

I tu właśnie się dzieje. To nie pasuje do pierwszego wzorca, ponieważ nie jest to lista pojedyncza - jest to lista z trzema elementami. Więc:

= [1,2,3] : [0,-3,5] : [0,0,0] : map head [[],[],[]] : transpose (map tail [[],[],[]])

Który da ci jeden błąd dla każdej pustej listy, ponieważ żadna head ani tail są zdefiniowane na pustych listach.


1 dla odpowiedzi nr 3

Weź pod uwagę, że pracujesz nad listą list. Dlatego twoje pierwsze dopasowanie wzorców zawsze kończy się niepowodzeniem na macierzy testowej. Zasadniczo wciąż bierzecie ogona każdego elementu listy, ale to nie zmniejsza liczby elementów na liście, po prostu zmniejsza ich indywidualny rozmiar.

Aby to poprawić, możesz zmodyfikować swój pierwszy wzór, aby dopasować go do struktury x.

Pamiętaj, listy list!