Wednesday, March 29, 2017

[Self Study] Haskell - day#0

Khi bế tắc, việc đầu tiên thanh niên nghĩ đến là học thứ gì đó mới mẻ và fun, và thanh niên đã nghĩ tới Haskell, một ngôn ngữ lập trình hướng hàm (Functional Programming Language), với cấu trúc khác hẳn các ngôn ngữ mà thanh niên hay dùng trong công việc, let him show his journey.
---
Environment:
Thanh niên học haskell trên môi trường linux (Arch linux)
---

Day0: Thanh niên tìm hiểu functional programming trên wiki, đọc sơ sơ để biết về nó, xong tìm hiểu overview về Haskel, tiếp tục thanh niên search từ khóa "learn haskell the hard way" và đọc từ trên xuống dưới.

http://yannesposito.com/Scratch/en/blog/Haskell-the-Hard-Way/#a-type-example

Vừa đọc, thanh niên vừa tìm cách cài tool "ghc" (Haskell compiler), "runhaskel" (run haskell như một script", ghci (haskell command line).

Đọc sơ sơ hắn đã biết Haskell rất khó học, nó khó một phần là do nó là Functional Programming Language (FP), một phần vì Haskell là ngôn ngữ thuần FP, bản thân FP đã khó học rồi, Haskell còn đặc biệt hơn vì nó là ngôn ngữ 100% FP, có một số ngôn ngữ khác cũng là FP, nhưng nó vẫn hỗ trợ imperative, nhưng Haskell thì không. Nó là một ngôn ngữ chỉ dành cho ai muốn học một thứ hoàn toàn khác biệt, không lai tạp, và nó rất hợp với hoàn cảnh của thanh niên lúc này.

Rất nhiều term mới đến với thanh niên, nhưng thanh nhiên bỏ qua, một cách từ tốn, thanh niên gõ những dòng đầu tiên để học về nó, hắn tạo một file mới tên hello.hs có nội dung như bên dưới,

main = print "Hello World!"


Sau đó hắn dùng ghc để build file hello.hs, và file executable tên hello đã được tạo ra
Voila, nó đã chạy, làm phức tạp vấn đề hơn một chút,

main = do
    print "Who are you?"
    yourname <- getLine
    print ("I am " ++ yourname)

Ok, nó đã chạy.


Cảm thấy bài viết trên trang yannesposito hơi cụt, với lại tác giả cũng nói rõ tác giả chỉ giới thiệu overiew thôi nên thanh niên tiếp tục với một trang web khác (http://learnyouahaskell.com/ Learn you a haskell), sau một lúc lại introduction về haskell, và thanh niên lại tiếp tục hành trình Starting out.

Trước khi đến với starting out, cần nhắc lại là ở phần introducotion của trang learnyouahaskell có nhắc đến cách setup môi trường để học Haskell cho hiệu quả:
  • Tạo riêng một thư mục làm việc
  • Trong thư mục đó tạo một file có tên .hs, chính là nơi lưu giữ source code bạn sẽ viết
  • Mở một commandline session trong thư mục đó (Trong linux thì đương nhiên, trong window là cmd thôi) và chạy lệnh ghci (chính là commandlined của Haskell), trong dấu nhắc "Prelude>" của ghci, chạy lệnh ":load filename.hs" để compile và load nội dung code haskell của bạn lên, cho những lần sau, mỗi khi thay đổi source code, chỉ cần gõ ":r" tại dấu nhắc của ghci.
Vậy là setup xong môi trường.

Bắt đầu với ghci, với các lệnh cộng trừ nhân chia cơ bản, không có gì đặc biệt, như bao ngôn ngữ khác.

Các câu lệnh logic and (&&), or (||), và "not". Các câu lệnh so sánh "==" và "/=", một điều lưu ý là với haskell, 2 vế của phép so sánh phải cùng type (type là gì mai mốt học sẽ biết). Haskell có khả năng so sánh 2 list số hoặc chữ.

Tiếp theo là một số hàm có sẵn của haskell:
  • max a b: lấy max(a,b) lưu ý cách gọi hàm của haskell là "function arg"
  • min a b: lấy min(a,b)
  • lưu ý với haskell hàn có độ ưu tiên hơn phép tính ví dụ "max 5 2*3" sẽ tương đương với "(max 5 2)*3" tức là 15, không phải "max 5 (2*3)" tức là kết quả là 6. Nên thử ngay để kiểm chứng lời thanh niên nói.
  • Có một điểm khá thú vị của haskell là khả năng linh hoạt trong cách viết cú pháp, ví dụ chúng ta có hàm div a b, lấy a chia b rồi trả ra phần nguyên, chúng ta có thể viết theo 2 cách "div 19 8" hoặc "19 `div` 8"
Next, chúng trang learyouahaskel sẽ hướng dẫn chung ta cách viết một vài hàm đơn giản, cách khai bao hàm của haskell khá đơn giản, trong haskell, definition và declaration của một hàm là một, và đặc biệt hơn, không giống như C, hàm của haskell không phân biệt thứ tự, trong source code haskell, bạn có thể define hàm foo trước hàm bar, nhưng trong hàm foo hoàn toàn có thể gọi hàm bar, nếu trong C, bạn sẽ bị báo lỗi "definition of sth is not found"

Next, cú pháp if else thần thánh

foo x = ( if x< 100
then DO_STH
else DO_STH_ELSE)

DO_STH_ELSE trong Haskell là bắt buộc.

Tổng kết ngày đầu tiên: cú pháp haskell khá đơn giản, thiên nhiều về toán học, chưa thấy điểm gì đặc biệt của ngôn ngữ haskell.
--




No comments:

Post a Comment