2016-12-30 13 views
0

マトリックスの最初と最後の列を削除する目に見えないコンポーネントと目に見えるコンポーネントを持つMLモジュール。 マトリックスは、以下に示すようにリストのリストとして格納されます。再マップを使用したsmlマップと構造

| 4 | 5 | 6 | 7 | | 8 | 9 | 10 | 11 | | 12 | 13 | 14 | 15 | => 4x4配列

上記の行列は、 val mat = [[4,5,6,7]、[8,9,10,11]、[12,13,14,15] ];

私はマップ機能を使用する必要があります。

サンプルラン:

  • ヴァルマット= [4,5,6,7]、[8,9,10,11]、[12,13,14,15]。
  • S.reduce(マット);

ヴァルそれは= [[5,6]、[9,10]、[13,14]]:int型のリスト一覧


しかし、私は次のように別の方法で試してみてください。

fun reduce(x,y,z,t)=(y,z); 
val mat = [(4,5,6,7),(8,9,10,11),(12,13,14,15)]; 
map reduce(mat); 

出力:

- val reduce = fn : 'a * 'b * 'c * 'd -> 'b * 'c                                 
val mat = [(4,5,6,7),(8,9,10,11),(12,13,14,15)] : (int * int * int * int) list                          
val it = [(5,6),(9,10),(13,14)] : (int * int) list 

正しい答えを見つけるためにどのように?

+0

リストは任意の長さを持つことができますが、タプルは固定長です:(a、bのような4タプルを扱う関数を定義した場合、リストは長さを持つことができます。 、a、b、c、d、e、f、g)のような他のタプルを扱うことはできません。だから、タプルではなくリストを使って作業する必要があります。パターンマッチングを使用する。 –

答えて

2

一方の端を最初に削除してからもう一方を削除すると、これは簡単です。

最初の列を削除するのは簡単です。それは単に各行にList.tlを適用しています:

- val mat=[[4,5,6,7],[8,9,10,11],[12,13,14,15]]; 
val mat = [[4,5,6,7],[8,9,10,11],[12,13,14,15]] : int list list 
- map tl mat; 
val it = [[5,6,7],[9,10,11],[13,14,15]] : int list list 

は最後を除くすべての要素を返さないライブラリ関数はありませんが、それは書くために合理的に簡単です:

fun except_last [] = [] 
    | except_last [x] = [] 
    | except_last (x::xs) = x :: (except_last xs); 

(空のリストのためのケースは疑問ですしかし、それはエラーとして扱いたいと思うかもしれませんが...)

- map except_last mat; 
val it = [[4,5,6],[8,9,10],[12,13,14]] : int list list 

そして、あなたは2つの機能を組み合わせますイオン:非常に非効率的でなく快適対称で

- fun reduce_row xs = except_last (tl xs); 
val reduce_row = fn : 'a list -> 'a list 
- fun reduce m = map reduce_row m; 
val reduce = fn : 'a list list -> 'a list list 
- reduce mat; 
val it = [[5,6],[9,10],[13,14]] : int list list 

代替実装、行を反転最初の要素を除去し、それをバック反転することによって、最後の列を削除することである。

- map (tl o rev o tl o rev) mat; 
val it = [[5,6],[9,10],[13,14]] : int list list 

関連する問題