ผลต่างระหว่างรุ่นของ "01204435/haskell1"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
 
(ไม่แสดง 5 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน)
แถว 70: แถว 70:
 
  fun1 x = add x (x * 10)
 
  fun1 x = add x (x * 10)
 
  fun2 x = add x x * 10
 
  fun2 x = add x x * 10
 +
 +
=== let, where ===
 +
=== if, guard, และ pattern matching ===
  
 
== tuples และ lists ==
 
== tuples และ lists ==
แถว 97: แถว 100:
 
  [1,2,3,4] ++ [5,6,7]
 
  [1,2,3,4] ++ [5,6,7]
  
== pattern matching ==
+
== 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
  
 +
คิดว่าเป็นเพราะว่าอะไร?
  
== recursion ==
+
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]