Wednesday, May 31, 2006

Operator And, Or -- Haskell vs. Java

ผมชอบความรู้สึกประหลาดใจ เวลาเรียนรู้ Haskell
หรือพวก Functional Language ทั้งหลาย
ก็คือเราจะเจอแนวคิดบางอย่างที่เราไม่เคยคิดมาก่อน
อย่างวันนี้เจอ วิธีการ define operator && (and)
กับ operator || (or) ของ Haskell
-- define Type --
-- operator นี้รับ parameter เป็น boolean, boolean
-- และ return เป็น type boolean
(&&), (||) :: Bool -> Bool -> Bool

False && x = False
True && x = x
False || x = x
True || x = True

จะเห็นว่ามีการใช้ Pattern Matching เข้ามาใช้
x ก็คือ Any Value

เทียบกับพวก imperative language
ในที่นี้จะยกตัวอย่าง Java แล้วกัน
เวลานึกถึง operator พวกนี้ (and ,or) ว่า compiler จะแปลงมันอย่างไร
มันจะลงเอยไปที่ระดับ assembly
ที่จะมี compare กับการ jump
ลองดูประโยคนี้ข้อง java
return x && y;

เมื่อแปลงเป็น byte code
   L0 (0)
LINENUMBER 5 L0
ILOAD 1: x # load ค่าใน local var ขึ้น operand stack
IFEQ L1 # ถ้าเป็น 0 กระโดดไป L1
ILOAD 2: y
IFEQ L1
ICONST_1 # return true
IRETURN
L1 (7)
ICONST_0 # return false
IRETURN

Related link from Roti

1 comment:

Anonymous said...

python ก็เป็นแบบ Haskell เหมือนกันครับ

ซึ่งบางคนจะใช้เป็น Trick ในการทำ ternary boolean expression (iif หรือ << a ? b : c >>) ซึ่ง python<=2.4 ไม่มี (จะมี << b if a else c >> ใน 2.5)

เช่น

>>> def total(x,y): return (x or 0) + (y or 0)

>>> total(3,None)
3

>>> total(3,4)
7