2016-04-06 11 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 ] 

誰もがこれが非網羅的なものになってしまうのではないかと考えていますか?私は何かが欠けているように感じるが、私は実際に知っているために自分自身をhaskellするには新しく、私はそれを教えているので、何かアドバイスをいただければ幸いです。私の機能のヘッドで非網羅的なパターン '

+1

入力が正しく整形されていないとどうなりますか?例えば。 'transpose '[" a "、"]] ' – gallais

答えて

2

head'tail'は、空のリストをパラメータとして指定した場合の動作を定義しません。あなたは次のことを定義する必要があります。

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

あなたはheadとtailの安全なバージョンを作成することができますが、安全なパッケージにはすでに存在しますが、タイプは '[a] - > Maybe a'と' [a] - > Maybe [a] 'です。 'headMay [] = Nothing'は' [] 'ではありません。また、 'head'、' tail'は空のリストの大文字を 'head [] = error" "'、 'tail [] = error" "と定義しています。 – jamshidh

+1

はあなたがしたことに依存しています....あなたは 'error'バージョンをそのまま使うことができ、警告は消えてしまいます。もしあなたが 'Maybe'バージョンを使いたいのであれば、'おそらく 'それに対処できるようにプログラムを再構成する必要があります。単純な置き換えではありません。 – jamshidh

1

、私は非常に流暢ではないよ、まだHaskellで、しかしtranspose'の以下のバージョンは、非ぼろぼろの行列に適しています:

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

例えば、

>>> 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]] 

が、ギザギザの行列で失敗した:

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

ライブラリ 'transpose'はあなたのものと似ていますが、' [] 'が基本ケースとして使用されています(可能であれば、;-)好きです)、' map head'の代わりにリストの補完が使われる(荒れた行列の欠けている要素をスキップします)。 http://hackage.haskell.org/package/base-4.8.2.0/docs/src/Data.OldList.html#transpose – chi

+0

@chiコメント+リンクに感謝します。 –

関連する問題