ReScript in Korean

배열과 리스트

원문

배열

배열은 리스크립트에서 최우선시되는 데이터 구조로, 자바스크립트 배열과 같은 방식으로 동작 합니다.

let myArray = ["hello", "world", "how are you"]
var myArray = ['hello', 'world', 'how are you'];

리스크립트의 배열에 있는 항목들은 꼭 같은(homogeneous) 타입이어야 합니다.

사용법

자세한 사용법은 Js.Array API 에서 확인해보세요.

다음과 같이 배열의 항목에 접근하거나 수정 할 수 있습니다.

let myArray = ["hello", "world", "how are you"]
let firstItem = myArray[0] /* "hello" */
myArray[0] = "hey" /* now ["hey", "world", "how are you"] */
var myArray = ['hello', 'world', 'how are you'];
var firstItem = myArray[0];
myArray[0] = 'hey';

리스트

리스크립트는 단일 연결리스트 또한 제공합니다.

이 리스트들은,

  • 불변입니다.
  • 선두의 항목을 가져오는 것이 빠릅니다.
  • 꼬리(마지막) 항목을 가져오는 것이 빠릅니다.
  • 나머지 다른 것들은 느립니다.
let myList = list{1, 2, 3}
var myList = {
hd: 1,
tl: {
hd: 2,
tl: {
hd: 3,
tl: 0,
},
},
};

배열과 같이, 리스트의 항목들은 꼭 같은 타입이어야 합니다.

사용법

리스트는 불변하고, 효율적인 기능(크기의 가변성, 빠른 속도로 선두 항목 추가, 항목 분해)을 사용하고자 하는 경우에 적합합니다.

만약 어느 항목에 무작위로 접근하거나 선두가 아닌 위치에 항목을 추가해야한다면 리스트를 쓰지마세요. 코드가 답답하고 느려질거니까요.

표준 라이브러리는 List 모듈를 제공합니다.

불변 리스트의 선두 항목 추가

아래의 전개(spread) 구문을 사용하세요.

let myList = list{1, 2, 3}
let anotherList = list{0, ...myList}
var myList = {
hd: 1,
tl: {
hd: 2,
tl: {
hd: 3,
tl: 0,
},
},
};
var anotherList = {
hd: 0,
tl: myList,
};

myList는 변하지 않고, anotherListlist{0, 1, 2, 3} 을 가지게 됐습니다. 보시다시피 효율적입니다.(상수의 시간복잡도) anotherList 마지막 3 항목은 myList에서 공유받았습니다!

list{a, ...b, ...c}는 문법오류가 발생한다는 것을 강조드립니다. 리스크립트는 여러 리스트를 하나의 리스트로 전개하는것을 지원하지 않습니다. 만약 이를 구현한다면 b의 각 항목이 c의 머리에 하나씩 추가되는 방식이어야 하는데, 이건 원치않는 선형 연산이기 때문입니다. 물론 이를 위해 List.concat을 사용 할 수 있으나 권장하지는 않습니다.

목록 중간에 있는 임의의 항목을 업데이트하는 것도 권장하지 않습니다. 성능 및 할당 오버헤드의 시간복잡도가 선형(O(n))이기 때문입니다.

접근(Access)

switch(패턴 매칭 / 구조분해 참고)는 보통 리스트의 항목에 접근하기 위해 사용됩니다.

let message =
switch myList {
| list{} => "This list is empty"
| list{a, ...rest} => "The head of the list is the string " ++ Js.Int.toString(a)
}
var message = myList
? 'The head of the list is the string ' + (1).toString()
: 'This list is empty';