2016-12-30 8 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

리스트의 길이는 고정되어 있지만 튜플의 길이는 고정되어 있습니다 : 4 개 튜플을 처리 할 함수를 정의하면 (a, b , c, d), (a, b, c) 또는 (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 

을 원하는 그리고 당신은 두 가지 (SECURITY) 기능을 비활성화 결합 이온 :

- 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 

(어느 누구도 실제 소프트웨어에서는 이것을 쓰지 않을 것이지만 멋지게 보일 것입니다.)