OCAM 베이스

13089 단어 OCaml

개시하다


책 《프로그래밍의 기초》를 읽고 학습 내용을 총결하였다.
(블로그에 정리했지만 전혀 업데이트되지 않아 Qita로 옮겼다
초보자라도 이 책을 열심히 읽으면 Ocaml을 이용해 도쿄 지하철의 최단 환승 노선을 찾는 프로그램을 만들 수 있다.
다음은 OCAml형, 패턴 매칭 등 환승 프로젝트를 만드는 데 필요한 지식을 정리했다.
(부적절한 내용, 오류 등이 있으면 지적해 주십시오.)

기본 데이터 유형


int   (* 整数 *)
float (* 実数 *)
주안점
int형과flat형은 서로 다른 데이터형으로 엄격하게 구분한다
사칙 연산을 진행할 때
int형 +-*/mod
flat형 +.-./.위에서 말한 바와 같이 모든 연산자 뒤에는 문장이 필요하고 * (멱) 은flat형만 사용할 수 있기 때문에 문장이 필요하지 않다

bool (* 真偽値(true false) *) 
주안점
비교 연산자와 함께 많이 사용
왼쪽부터 not 우선 실행 (아니 ~) & (A 및 B) | | (A 또는 B)
비교 연산자는 모든 데이터에 사용할 수 있습니다.

string (* 文字列 *) 
주안점
따옴표("")로 텍스트 둘러싸기^^ 두 문자열 연결하기

변수 정의


let 変数名 = 
변수를 다시 쓸 수 없습니다. (다른 언어의 상수에 가깝습니다.)
변수 이름은 소문자로 시작해야 합니다.

함수 정의


let 関数名 引数 = 
(* または *)
let 変数名 = fun 引数 -> 
②fun 매개 변수 -> 공식에서만 무명 함수로 사용 가능
이 경우 보조 함수 등을 만들 때 함수 명칭을 일일이 고려할 필요가 없다
다른 곳에서 정의된 함수 이름과 덮어쓰는 기능을 걱정하지 않아도 된다는 장점이 있다.
단, 귀속 함수는 ②의 형식으로 정의할 수 없기 때문에 ①의 형식으로 정의해야 한다.

조건 브랜치


if 条件1 then 式1
  else if 条件2 then 式2 
               else 式3
조건1이 성립되면 집행식1, 조건1이 성립되지 않으면 집행식2
조건1과 조건2가 모두 성립되지 않으면 집행식3
주안점
조건은 bool이어야 합니다.
양식이 모두 똑같아야 한다

내부 패브릭 데이터


그룹


몇 개의 데이터를 하나의 데이터로 병렬하다
서로 다른 유형의 요소를 한데 배열할 수 있다
만약 (쉼표) 가 있다면 () 로 묶을 필요가 없지만, 가독성이 떨어지기 때문에 하지 않는다

("oshima", 175.6)

(* このデータ型はstring * float *)

레코드


{이름 1=값 1;이름 2=값 2}(필드라고 함) 및 값을 링크할 수 있습니다.
숫자에 문자열을 제공하려면 더블 인덱스를 사용해야 합니다.작은따옴표를 사용하면 Syntax Error
새 유형을 미리 정의해야 합니다(다음 유형 정의 참조).

{namae = "hiroki"; tensuu = 75; seiseki = "B"}

유형 정의


음반을 사용할 때는 반드시 스스로 새로운 유형을 정의해야 하며, 사용하고 싶은 필드의 이름을 OCAml에 알려야 한다.
먼저 유형을 정의한 다음에 처리 기록의 함수를 정의한다
type 새 정의 형식의 이름 = 이 형식의 정의

type gakusei_t = {
  namae : string; (* 名前 *)
  tensuu : int; (* 点数 *)
  seiseki : string; (* 成績 *)
}

리스트


같은 유형의 데이터는 임의의 개수로 배열된 데이터이다
데이터의 개수와 집합이 다르다(다시 말하면 몇 가지 요소가 있을 수 있다)
그리고 목록의 요소는 반드시 같은 유형이어야 한다
목록 정의
1. 빈 목록 []은 목록
2.first는 요소입니다.rest가 목록이면first::rest도 목록입니다

(* 書き方は2パターンあり、下記は両方同じリストを表現している *)
要素1 :: 要素2 :: 要素3 :: ... :: 要素n :: []
[要素1; 要素2; 要素3 ... 要素n]

패턴 일치


여러 데이터에서 데이터 내용을 추출하는 방법(대조 도안)

match 式1 with 
  パターン -> 式2
절차.
1. match와 with 사이에 끼어 있는 식 1 실행하기
2. 결과를 패턴과 대조
3. 결과 대조 실행식 사용 2

그룹 상태


let sum pair = match pair with
  (a, b) -> a + b 

sum (3, 5) = 8

기록된 상황


let tsuuchi gakusei = match gakusei with
  {namae = n; tensuu = t; seiseki = s} -> 
    n ^ "さんは" ^ string_of_int t ^ "点で成績は" ^ s ^ "です"
함수 tsuuuchi 매개 변수gakusei를 받은 후 패턴 일치에서 기록 내용을 추출합니다
개별 값이 문자(모드 변수)로 들어갑니다.
함수 tsuuuchi는 이 모드 변수를 사용하여 값을 되돌려줍니다.

목록 모드 일치와 귀속 함수


リストの要素を全て足した結果を返す関数
let rec sum lst = match lst with
    [] -> 0
  | first :: rest -> first + sum rest 
정의할 함수 호출 이 함수 자체 (귀속 호출)
귀속 호출을 포함하는 함수를 귀속 함수라고 부른다
함수형 언어로 순환하는 강력한 수단
(let 뒤에 rec 필요)

로컬 함수 정의


let 변수 이름 = 식 1 in 식 2
변수 이름은 표현식 2에서만 표현식 1로 정의됩니다.
변수 이름도 직접 모드를 설명할 수 있습니다
in을 제거하면 변수 이름으로 참조 1(부분적)을 참조할 수 없습니다.

let x = 2 in x + x ;;
- : int = 4

고급 함수를 사용하여 목록 처리


OCAM에서 준비한 세 가지 고급 함수
1. 맵 리스트의 모든 요소에 대해 동일 처리

map : ('a -> 'b) -> 'a list -> 'b list
let rec map f lst = match lst with
    [] -> []
  | first :: rest -> f first :: map f rest
2. 특정 요구 사항을 충족하는 요소 추출

filter : ('a - bool) -> 'a list -> 'a list
let rec filter p lst = match lst with
    [] -> []
  | first :: rest -> if p first then first :: filter p rest
                                else filter p rest
3.fold_right는 각 요소의 값을 집합합니다. (덧붙이거나 문자열로 바꿉니다.)

fold_right : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b
let rec fold_right f lst init = match lst with
    [] -> init
  | first :: rest -> f first ( fold_right f rest init )

감상


전체 5분의 4를 읽고 환승 문제를 해결하는 프로그램을 만들 수 있다
처음 사용하는 언어를 1부터 배우기 시작하면서 프로그램을 만드는 체험은 자신에게 큰 자신감이 된다.
17장에서 2분 탐색트리를 이용해 환승 프로그램을 만들기 전까지는 상당한 시간이 걸린다(총 100시간 정도?)많은 시간이 걸렸기 때문에 나처럼 첫 번째 학자인 사람은 그에 상응하는 시간을 투자할 필요가 있음을 미리 고려하여 학습 계획을 세우는 것이 좋다.

참고서


프로그램 설계의 기초

좋은 웹페이지 즐겨찾기