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

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
 
(ไม่แสดง 11 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน)
แถว 16: แถว 16:
 
  `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 เราสามารถกำหนดตัวแปรเพื่อแทนค่าบางค่าได้ โดยใช้คำสั่ง let
 
ใน ghci เราสามารถกำหนดตัวแปรเพื่อแทนค่าบางค่าได้ โดยใช้คำสั่ง let
แถว 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]