ผลต่างระหว่างรุ่นของ "01204435/haskell1"
Jittat (คุย | มีส่วนร่วม) (→ตัวแปร) |
Jittat (คุย | มีส่วนร่วม) |
||
(ไม่แสดง 10 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน) | |||
แถว 15: | แถว 15: | ||
mod 15 4 | mod 15 4 | ||
`mod` 7 | `mod` 7 | ||
+ | |||
+ | True | ||
+ | True && (2 == 5) | ||
+ | True || (2 == 5) | ||
+ | (4 > 3) || (2 == 5) | ||
+ | |||
+ | :type 'a' | ||
+ | :type "a" | ||
+ | :type "hello" | ||
+ | :type 10 | ||
+ | :type 20.5 | ||
+ | :type True | ||
+ | :type (20 == 30) | ||
== ตัวแปรใน ghci == | == ตัวแปรใน ghci == | ||
แถว 28: | แถว 41: | ||
== ฟังก์ชัน == | == ฟังก์ชัน == | ||
− | == | + | เราไม่สามารถนิยามฟังก์ชันภายใน ghci ได้ เราต้องสร้างแฟ้มภายนอก (โดยมากนิยมใช้นามสกุล .hs) สร้างแฟ้ม htest1.hs โดยใส่นิยามของฟังก์ชันสองฟังก์ชันดังนี้ |
+ | |||
+ | add x y = x + y | ||
+ | |||
+ | double x = add x x | ||
+ | |||
+ | ใน ghci เราสามารถโหลดนิยามของฟังก์ชันได้ โดยสั่ง | ||
+ | |||
+ | :load htest1 | ||
+ | |||
+ | จะเห็นว่า prompt เปลี่ยนจาก Prelude เป็น Main (แทนชื่อโมดูลที่เราทำงานอยู่) | ||
+ | |||
+ | ถ้าเรามีการแก้ไขไฟล์ และต้องการโหลดใหม่ ให้สั่ง | ||
+ | |||
+ | :reload | ||
+ | |||
+ | เราสามารถทดลอง | ||
+ | |||
+ | add 10 20 | ||
+ | 10 `add` 40 | ||
+ | let f = add 100 | ||
+ | f 20 | ||
+ | let g = double | ||
+ | g 50 | ||
+ | |||
+ | เพิ่มนิยามของสองฟังก์ชันนี้เข้าไป และทดลอง ฟังก์ชันทั้งสองต่างกันอย่างไร | ||
+ | |||
+ | fun1 x = add x (x * 10) | ||
+ | fun2 x = add x x * 10 | ||
+ | |||
+ | === let, where === | ||
+ | === if, guard, และ pattern matching === | ||
+ | |||
+ | == tuples และ lists == | ||
+ | |||
+ | ข้อมูลพื้นฐานใน Haskell คือ tuples และ lists | ||
+ | |||
+ | ลิสต์เขียนโดยใส่ข้อมูลในรายการในเครื่องหมาย <nowiki>[ ]</nowiki> เช่น | ||
+ | |||
+ | [1,2,3,4] | ||
+ | ['a',b','c'] | ||
+ | |||
+ | ทดลอง | ||
+ | |||
+ | :type [1,2,3,4] | ||
+ | :type [True,False,True] | ||
+ | :type ["hello","world","good-bye"] | ||
+ | :type "hello" | ||
+ | |||
+ | ด้านล่างเป็นตัวอย่างฟังก์ชันพื้นฐานบนลิสต์ | ||
+ | |||
+ | head [1,2,3,4] | ||
+ | tail [1,2,3,4] | ||
+ | take 2 [1,2,3,4] | ||
+ | drop 3 [1,2,3,4] | ||
+ | length [1,2,3,4] | ||
+ | sum [1,2,3,4] | ||
+ | [1,2,3,4] ++ [5,6,7] | ||
+ | |||
+ | == recursion == | ||
+ | พิจารณาตัวอย่าง | ||
+ | |||
+ | mysum :: Num a => [a] -> a | ||
+ | mysum [] = 0 | ||
+ | mysum (x:xs) = x + sum xs | ||
+ | |||
+ | === แบบฝึกหัด recursion === | ||
+ | |||
+ | 1. เขียนฟังก์ชัน mylen | ||
+ | |||
+ | *Main> mylen [1,2,3,4,5] | ||
+ | 5 | ||
+ | |||
+ | 2. เขียนฟังก์ชัน mylast | ||
+ | |||
+ | *Main> mylast [1,2,3] | ||
+ | 3 | ||
+ | |||
+ | ทดลองเรียก แล้วอาจจะพบ | ||
+ | |||
+ | *Main> mylast [] | ||
+ | *** Exception: htest.hs:(18,1)-(19,25): Non-exhaustive patterns in function mylast | ||
+ | |||
+ | คิดว่าเป็นเพราะว่าอะไร? | ||
+ | |||
+ | 3. เขียนฟังก์ชัน myappend | ||
+ | |||
+ | *Main> myappend [1,2,3,4,5] 100 | ||
+ | [1,2,3,4,5,100] | ||
+ | |||
+ | 4. เขียนฟังก์ชัน myconcat | ||
+ | |||
+ | *Main> myconcat [1,2,3] [10,20,30] | ||
+ | [1,2,3,10,20,30] |
รุ่นแก้ไขปัจจุบันเมื่อ 09:14, 18 มิถุนายน 2556
หน้านี้เป็นส่วนหนึ่งของรายวิชา 01204435 ภาคต้น 2556
เนื้อหา
ทดลองทั่วไป
เรียก ghci แล้วทดลองคำสั่งทั่วไปดังนี้ (ทดลองพิมพ์ไปตามลำดับ)
1 + 2 1 / 5 5 * 10 5 ^ 2
div 20 4 div 20 3 25 `div` 7 mod 15 4 `mod` 7
True True && (2 == 5) True || (2 == 5) (4 > 3) || (2 == 5)
:type 'a' :type "a" :type "hello" :type 10 :type 20.5 :type True :type (20 == 30)
ตัวแปรใน ghci
ใน ghci เราสามารถกำหนดตัวแปรเพื่อแทนค่าบางค่าได้ โดยใช้คำสั่ง let
let x = 10 x * 10 let y = 20 x * y let x = 100 in let y = 20 in x * y
ฟังก์ชัน
เราไม่สามารถนิยามฟังก์ชันภายใน ghci ได้ เราต้องสร้างแฟ้มภายนอก (โดยมากนิยมใช้นามสกุล .hs) สร้างแฟ้ม htest1.hs โดยใส่นิยามของฟังก์ชันสองฟังก์ชันดังนี้
add x y = x + y double x = add x x
ใน ghci เราสามารถโหลดนิยามของฟังก์ชันได้ โดยสั่ง
:load htest1
จะเห็นว่า prompt เปลี่ยนจาก Prelude เป็น Main (แทนชื่อโมดูลที่เราทำงานอยู่)
ถ้าเรามีการแก้ไขไฟล์ และต้องการโหลดใหม่ ให้สั่ง
:reload
เราสามารถทดลอง
add 10 20 10 `add` 40 let f = add 100 f 20 let g = double g 50
เพิ่มนิยามของสองฟังก์ชันนี้เข้าไป และทดลอง ฟังก์ชันทั้งสองต่างกันอย่างไร
fun1 x = add x (x * 10) fun2 x = add x x * 10
let, where
if, guard, และ pattern matching
tuples และ lists
ข้อมูลพื้นฐานใน Haskell คือ tuples และ lists
ลิสต์เขียนโดยใส่ข้อมูลในรายการในเครื่องหมาย [ ] เช่น
[1,2,3,4] ['a',b','c']
ทดลอง
:type [1,2,3,4] :type [True,False,True] :type ["hello","world","good-bye"] :type "hello"
ด้านล่างเป็นตัวอย่างฟังก์ชันพื้นฐานบนลิสต์
head [1,2,3,4] tail [1,2,3,4] take 2 [1,2,3,4] drop 3 [1,2,3,4] length [1,2,3,4] sum [1,2,3,4] [1,2,3,4] ++ [5,6,7]
recursion
พิจารณาตัวอย่าง
mysum :: Num a => [a] -> a mysum [] = 0 mysum (x:xs) = x + sum xs
แบบฝึกหัด recursion
1. เขียนฟังก์ชัน mylen
*Main> mylen [1,2,3,4,5] 5
2. เขียนฟังก์ชัน mylast
*Main> mylast [1,2,3] 3
ทดลองเรียก แล้วอาจจะพบ
*Main> mylast [] *** Exception: htest.hs:(18,1)-(19,25): Non-exhaustive patterns in function mylast
คิดว่าเป็นเพราะว่าอะไร?
3. เขียนฟังก์ชัน myappend
*Main> myappend [1,2,3,4,5] 100 [1,2,3,4,5,100]
4. เขียนฟังก์ชัน myconcat
*Main> myconcat [1,2,3] [10,20,30] [1,2,3,10,20,30]