2016-04-06 6 views
2
transpose' :: [[a]] -> [[a]] 
transpose' [[]] = [] 
transpose' [[], _] = [] 
transpose' rows = (map head' rows) : transpose' (map tail' rows) 
    where 
    head' (x:_) = x 
    tail' (_:xs) = xs 

matMult3 :: (Num a) => [[a]] -> [[a]] -> [[a]] 
matMult3 a b = [ [ sum $ zipWith (*) ar bc | bc <- (transpose' b) ] | ar <- a ] 

Wer hat irgendwelche Ideen, warum dies könnte eine nicht erschöpfende werfen? Ich habe das Gefühl, dass etwas fehlt, aber ich bin zu neu, um es selbst zu wissen, ich lerne es selbst, also könnte das der Grund sein, jeder Rat würde geschätzt werden.Nicht erschöpfende Muster in meiner Funktion Kopf '

+1

Was passiert, wenn meine Eingabe nicht gut ist? Z.B. Transponieren ["a", ""] '. – gallais

Antwort

2

Sowohl head' als auch tail' definieren nicht, was passiert, wenn Sie die leere Liste als Parameter angeben. Sie müssen Folgendes definieren:

head' [] = .... 
tail' [] = .... 
+0

können Sie eine sichere Version von Kopf und Schwanz erstellen (die bereits im sicheren Paket vorhanden ist), aber der Typ wäre '[a] -> Maybe a' und' [a] -> Maybe [a] '. Beachten Sie, dass 'headMay [] = Nothing', nicht' [] '. Beachten Sie auch, dass regulärer 'head',' tail' den leeren Listenfall als 'head [] = error" "," tail [] = error "" 'definiert. – jamshidh

+1

hängt davon ab, was Sie getan haben .... Sie sollten in der Lage sein, die 'error'-Version zu verwenden, und die Warnung verschwindet. Wenn Sie die 'Maybe'-Version verwenden wollen, müssen Sie das Programm neu strukturieren, um mit dem' Maybe' umgehen zu können, es ist kein einfacher Ersatz. – jamshidh

1

Ich bin nicht sehr fließend noch in Haskell, aber die folgenden Version von transpose' funktioniert gut für Nicht-zackige Matrizen:

transpose' :: [[a]] -> [[a]] 
transpose' ([x]: xs) = [x: map singleTail' xs] where 
    singleTail' [x] = x 
transpose' rows = (map head rows) : transpose' (map tail rows) 

ZB

>>> transpose' [[1], [2], [3]] 
[[1,2,3]] 

>>> transpose' [[1,2,3]] 
[[1], [2], [3]] 

>>> transpose' [[1, 2], [2, 3], [3, 4]] 
[[1,2,3],[2,3,4]] 

aber nicht für zerlumpte Matrizen:

>>> transpose' [[1, 2], [2, 3], [3, 4, 5]] 
:3:5-23: Non-exhaustive patterns in function singleTail' 
+1

Die 'transpose'-Bibliothek ist Ihrer ähnlich, außer dass' [] 'als Basisfall verwendet wird (wir bevorzugen das, wenn möglich ;-)) und dass Listen-Comprehensions anstelle von' map head' verwendet werden, so dass sie fehlschlagen anmutig (fehlende Elemente für zerlumpte Matrizen überspringen). http://hackage.haskell.org/package/base-4.8.2.0/docs/src/Data.OldList.html#transpose – chi

+0

@chi Vielen Dank für den Kommentar + Link. –

Verwandte Themen