- syntax: เขียนยังไงให้ computer เข้าใจเรา?
- semantics: ภาษาที่เราเขียนมันมีขั้นตอนการทำงานยังไง?
- idioms: ปรัญชาเบื้องหลังภาษานั้นๆ
- เช่นภาษา python มีปรัชญาว่า มันควรมีเพียงวิธีเดียว (ที่ดีที่สุด) ในการเขียนโปรแกรมให้ทำงานอยากเดียวกัน (เพื่อให้ programmer สามารถอ่าน code คนอื่นได้ง่าย)
- ส่วนภาษา ruby มีปรัชญาตรงนี้กลับกัน คือจะเขียนยังไงก็ได้ให้มันทำงานได้ (programmer จะสนุกกับการเขียนโปรแกรม... แต่ programmer คนอื่นมาอ่านรู้เรื่องหรือเปล่าก็อีกเรื่อง)
- libraries: code ที่คนอื่นเขียนไว้ให้ใช้
- tools: เครื่องมือช่วยสร้างโปรแกรมในภาษานั้นๆ เช่น repl, debugger, ide
สายศึกษาภาษาแบบ pure จะไม่สนใจ 2 ข้อหลังเท่าไหร่ แต่ถ้าจะเอาภาษาไปใช้ทำงานจริงก็ควรดูให้ครบ
- ตัวแปรเป็นแบบ static strong
- static คือ โปรแกรมจะต้องรู้ type ของตัวแปร/ฟังก์ชันตั้งแต่ตอน compile
- เช่น เขียนฟังก์ชัน f จะต้องรู้ตั้งแต่ตอนเขียนว่า ฟังก์ชันนี้จะรับตัวแปร type อะไร และคืนค่าเป็น type อะไร
- strong คือ ตัวแปรชนิดไหนก็สามารถทำงานได้กับฟังก์ชันชนิดนั้นๆ ไม่สามารถทำงานข้ามกันได้
- เช่น จะหาค่าของ
'a' + 1
ไม่ได้ (แต่ถ้าเป็นในภาษา C ทำได้)
- เช่น จะหาค่าของ
- static คือ โปรแกรมจะต้องรู้ type ของตัวแปร/ฟังก์ชันตั้งแต่ตอน compile
- นอกจากนี้ ตัวแปรยังเป็น immutable คือสร้างขึ้นมาครั้งเดียว ห้ามเปลี่ยนค่า
- แต่ทำ
val a = a + 1
ได้ โดยที่ a ฝั่งขวามือจะโดนทำให้หายไป (ไม่สามารถเรียกมาใช้ได้อีก) เรียกกระบวนการนี้ว่า shadowing
- แต่ทำ
- เก็บข้อมูลที่มี type เดียวใช้ list
- ตรวจว่า list
l
ว่างหรือไม่โดยnull l
- ข้อมูลตัวแรกสุดของ list คือ
hd l
- ข้อมูลตัวที่เหลือยกเว้นตัวแรกคือ
tl l
- ตรวจว่า list
- เก็บข้อมูลที่มี type หลายๆ type ปนกันใช้ tuple
- เข้าถึงสมาชิกตัวที่
n
ของ tuplet
ได้โดยคำสั่ง#n t
- เข้าถึงสมาชิกตัวที่
- ฟังก์ชันตัวแปรเดียวเรียกใช้ไม่ต้องมีวงเล็บครอบตัวแปร
- ฟังก์ชันหลายตัวแปรใช้วงเล็บครอบตัวแปร ... หรือจะมองว่ามันเป็นการเรียกฟังก์ชันที่มีตัวแปรเป็น tuple ก้ได้
- เนื่องจากข้อมูลเป็น immutable (ไม่สามารถเขียน
for(i=0;i<10;i++)
อะไรแนวนี้ได้) ฟังก์ชันที่วน loop ต้องเขียนแบบ recursive - ใช้
let <exp> in <exp> end
เพื่อกำหนด locals scope ของตัวแปร- จะเขียนฟังก์ชันในฟังก์ชันก็ได้ ไม่มีปัญหาอะไร
if <exp> then <exp> else <exp>
ต้องมีส่วนelse
เสมอ (และต้องคืนค่าเป็น type เดียวกับส่วนthen
ด้วย)- เนื่องจากมันต้องคืนค่าเป็น type เดียวกัน แต่บางกรณีก็ไม่มีค่าให้คืน (เช่น
hd []
) ดังนั้นต้องใช้สิ่งที่เรียกว่า option- คืนค่า
NONE
เมื่อไม่มีค่าให้คืน - คืนค่า
SOME v
เมื่อมีค่าให้คืน (v
เป็น type อะไรก็ได้) ... โดยเวลาจะเอาค่านั้นมาใช้ให้สั่งvalOf (SOME v)
- คืนค่า
- เปรียบเทียบลำดับด้วย
=, <>, <, >, <=, >=
- หมายเหตุว่า float ใน ml ไม่มีเครื่องหมาย
=, <>
ให้ใช้
- หมายเหตุว่า float ใน ml ไม่มีเครื่องหมาย
- ดำเนินการบูลีนด้วย
andalso, orelse, not