「OCaml筆記」修訂間的差異

出自Tan Kian-ting的維基
跳至導覽 跳至搜尋
 
(未顯示同一使用者於中間所作的 11 次修訂)
行 1: 行 1:
{{nav|程式語言、邏輯學}}
{{nav|程式語言、邏輯學}}
==基本指令==
* <code>A ^ B</code>:連結A、B字串(字串相加)


==在 repl 模式匯入其他程式碼==
==在 repl 模式匯入其他程式碼==
行 6: 行 9:
在命令行輸入 ocaml ,輸入
在命令行輸入 ocaml ,輸入


<code># use "another_mode.ml"</code>
<code># use "another_mode.ml"</code>(注意引號也要輸入)


=== 編譯時 ===
=== 編譯時 ===
行 26: 行 29:
ocamlopt -c b.ml
ocamlopt -c b.ml
ocamlopt -o a a.cmx b.cmx</pre>
ocamlopt -o a a.cmx b.cmx</pre>
==可變的模擬==
原則上,OCaml的物件是不可變的,但是可以用參照(reference、引用)模擬。
如下範例:
<pre>
# let x = ref [1;2];;  (* 設定 x 是一個引用,指向 [1; 2]這個列表(list)。 *)
val x : int list ref = {contents = [1; 2]}
# !x (* 取得 x 引用的值(列表) *)
- : int list = [1; 2]
# x := 3::!x;; (* 將 x 指涉的列表前面加上元素 3,然後指定 := 到 x 這個 ref,更新參照指向 *)
- : unit = ()
# !x;; (* 取得 x 的內容,可以發現已經更新。 *)
- : int list = [3; 1; 2]
</pre>
== n 維陣列==
<code>Array.make [大小] [初始值]</code>
警告:初始值他們指向的變數是同一個,也就是變動(若可)其中一個項目,其他項目也會跟著動。
不想這樣的話,請用 Array.init
== for loop ==
<pre>for i = 0 to max do
...
done</pre>
== 得到某自定資料型別的某個 item ==
* [https://stackoverflow.com/questions/50321552/get-element-from-a-type-ocaml Get element from a type ocaml]
==Ocaml的document string==
* [[Ocaml的docstring]]
==使用其他的套件,如果系統無法主動匯入==
<code>ocamlfind ocamlc example.ml -package [package1] -package [package2] -linkpkg</code>
==找到某個函式庫在哪裡==
<code>ocamlfind query [函式庫名稱]</code>
==Hashtable==
===建立Hashtable===
<code>Hashtbl.create n</code>n是初始大小
===是否為成員===
<code>Hashtbl.mem tbl x </code>
===設定新的key-data binding===
舊有的binding不會消失
<code>Hashtbl.add tbl key data </code>
===用key 得到其目前的bound value===
<code>Hashtbl.find tbl x </code>
===用key 得到其歷來的bound values===
<code>Hashtbl.find_all tbl x</code>


==參考==
==參考==
* [https://stackoverflow.com/questions/16594333/how-to-include-other-source-files-using-the-use-directive-in-ocaml How to include other source files using the #use directive in OCaml? - StackOverflow]
* [https://stackoverflow.com/questions/16594333/how-to-include-other-source-files-using-the-use-directive-in-ocaml How to include other source files using the #use directive in OCaml? - StackOverflow]
* [https://ocaml.org/learn/tutorials/modules.zh.html OCaml 的說明文件]
* [https://ocaml.org/learn/tutorials/modules.zh.html OCaml 的說明文件]
 
* [https://v2.ocaml.org/api/Hashtbl.html Module Hashtbl]
* [https://v2.ocaml.org/api/Array.html OCaml 的說明文件 module Array]
[[category:資訊]]
[[category:資訊]]

於 2024年3月25日 (一) 20:15 的最新修訂

基本指令

  • A ^ B:連結A、B字串(字串相加)

在 repl 模式匯入其他程式碼

命令行

在命令行輸入 ocaml ,輸入

# use "another_mode.ml"(注意引號也要輸入)

編譯時

另外如果要引用其他的程式碼,把所有程式碼放在目錄中,成爲:

Folder
 ├── a.ml
 └── b.ml

在 a.ml 內引用 b.ml 的內容:

_ = B.foo x

編譯時:

ocamlopt -c a.ml
ocamlopt -c b.ml
ocamlopt -o a a.cmx b.cmx

可變的模擬

原則上,OCaml的物件是不可變的,但是可以用參照(reference、引用)模擬。

如下範例:

# let x = ref [1;2];;  (* 設定 x 是一個引用,指向 [1; 2]這個列表(list)。 *)
val x : int list ref = {contents = [1; 2]}
# !x (* 取得 x 引用的值(列表) *)
- : int list = [1; 2]
# x := 3::!x;; (* 將 x 指涉的列表前面加上元素 3,然後指定 := 到 x 這個 ref,更新參照指向 *)
- : unit = ()
# !x;; (* 取得 x 的內容,可以發現已經更新。 *)
- : int list = [3; 1; 2]

n 維陣列

Array.make [大小] [初始值]

警告:初始值他們指向的變數是同一個,也就是變動(若可)其中一個項目,其他項目也會跟著動。

不想這樣的話,請用 Array.init

for loop

for i = 0 to max do
...
done

得到某自定資料型別的某個 item

Ocaml的document string

使用其他的套件,如果系統無法主動匯入

ocamlfind ocamlc example.ml -package [package1] -package [package2] -linkpkg

找到某個函式庫在哪裡

ocamlfind query [函式庫名稱]

Hashtable

建立Hashtable

Hashtbl.create nn是初始大小

是否為成員

Hashtbl.mem tbl x

設定新的key-data binding

舊有的binding不會消失 Hashtbl.add tbl key data

用key 得到其目前的bound value

Hashtbl.find tbl x

用key 得到其歷來的bound values

Hashtbl.find_all tbl x

參考