「OCaml筆記」修訂間的差異
跳至導覽
跳至搜尋
Tankianting(討論 | 貢獻) |
Tankianting(討論 | 貢獻) |
||
(未顯示同一使用者於中間所作的 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 n
n是初始大小
是否為成員
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