Skip to main content

Bài 12 - Cài đặt Haskell cục bộ

Chúng ta đang bắt đầu làm quen với việc viết mã trong Haskell và chúng ta đã sẵn sàng để trở nên nghiêm túc. Trong loạt bài học tiếp theo, chúng ta sẽ học cách quản lý môi trường phát triển của mình, tạo Dự án Haskell, xử lý lỗi và giải quyết vấn đề nói chung. Các kỹ năng cơ bản mà mọi nhà phát triển Haskell phải có.

Đây là bài học đầu tiên trong sê-ri. Và đó là một cái ngắn. Nơi chúng ta sẽ thiết lập môi trường phát triển cục bộ và biên dịch chương trình đầu tiên của mình.

TÓM TẮT
  • Cài đặt Haskell
    • Cài đặt GHCup
    • Cài đặt GHC, Cabal, Stack và HLS với GHCup
    • Cài đặt tiện ích mở rộng VSCode
  • Tạo chương trình đầu tiên
    • Viết chương trình Haskell đơn giản nhất
    • Biên dịch và chạy chương trình
Video bài giảng
Chúng tôi đang dịch thuyết minh bài giảng sang tiếng Việt

Cài đặt Haskell Tooling (Trên mọi hệ điều hành)

Vui lòng bỏ qua phần này nếu bạn không muốn cài đặt bất kỳ thứ gì cục bộ và muốn tiếp tục sử dụng môi trường nhà phát triển trực tuyến.

Chúng ta cần một cách để chuyển đổi mã nguồn Haskell thành mã gốc mà máy tính của chúng ta có thể chạy. Và để làm được điều đó, chúng ta cần một trình biên dịch. Trình biên dịch Haskell được sử dụng rộng rãi nhất là GHC. Hãy cùng tìm hiểu cách cài đặt và sử dụng nó.

GHCi (môi trường tương tác) đã đi kèm với GHC. Có một vài cách khác nhau để cài đặt GHC. Chúng ta có thể tải xuống trực tiếp từ trang web của nó. Nhưng có những lựa chọn tốt hơn. Ví dụ:

Chúng ta sẽ sử dụng GHCup vì Stack làm được nhiều việc hơn là chỉ cài đặt công cụ Haskell và tôi muốn thực hiện từng bước. Nhưng cứ thoải mái sử dụng Stack nếu bạn thích.

Vì vậy, để cài đặt các công cụ của chúng ta, hãy truy cập trang web GHCup và chạy lệnh mà nó hiển thị cho bạn trên thiết bị đầu cuối.

Bạn có thể nhấp vào "Hiển thị tất cả các nền tảng" nếu hệ điều hành của bạn không được hiển thị.

Khi bạn chạy lệnh, nó sẽ hỏi bạn một số câu hỏi về những gì bạn muốn cài đặt. Đảm bảo đã cài đặt—ít nhất—GHC, Haskell Language Server và cabal-install.

Và thế là xong! Chúng ta có mọi thứ chúng ta cần! Tất nhiên, giả sử rằng bạn có một trình soạn thảo văn bản. Còn Mirosoft Word thì không tính.

Nếu bạn chưa có, hãy cài đặt VSCode. Nó được sử dụng rộng rãi nhất và rất thân thiện.

Nếu VSCode đề nghị cài đặt tiện ích mở rộng, hãy đồng ý. Nếu không, hãy tìm kiếm "Haskell" trong ngăn tiện ích mở rộng và không phải là hai tiện ích được tải xuống nhiều nhất.

ĐƯỢC RỒI! Đủ với các thiết lập! Hãy biên dịch chương trình đầu tiên của chúng ta!

Biên dịch chương trình Haskell

Trong phần này, chúng ta sẽ chỉ cho bạn cách biên dịch các tệp Haskell đơn giản, sau đó chúng ta sẽ chỉ cho bạn cách biên dịch một dự án phức tạp hơn bằng Cabal.

Trong bài học trước, chúng ta đã xem một trong những chương trình Haskell ngắn nhất mà bạn có thể viết. Cái này:


main :: IO ()

main = putStrLn "Hello World!"

Một chương trình đơn giản in "Hello thế giới" trên đầu ra tiêu chuẩn. Hãy nhớ rằng tất cả các chương trình của bạn phải có một hành động được gọi là chính có chức năng như điểm vào chương trình của bạn.

ĐƯỢC RỒI! Hãy biên dịch cậu bé hư này!

Bởi vì chúng ta đang sử dụng Jupyter Notebook này, chúng ta sẽ phải sử dụng một số công cụ dòng lệnh để thực hiện điều đó. Nhưng bạn chỉ có thể viết một tệp có phần mở rộng .hs và biên dịch nó bằng cách sử dụng ghc (không có :! ở trước) như tôi trình bày ở cuối.

Vì thế. trước tiên, chúng ta sẽ lưu hành động chính trong một tệp bằng lệnh này:


:!echo "main = putStrLn "Hello World!"" >> hello.hs

Nếu chúng ta tìm kiếm một tệp haskell, chúng ta sẽ thấy rằng nó ở đó:


:!ls | grep 'Hello'

hello.hs

Và, nếu chúng ta kiểm tra nội dung của nó, chúng ta chỉ tìm thấy hành động chính:


:!cat hello.hs

main = putStrLn "Hello World!"

Ok, hãy biên dịch nó!

Để biên dịch một tệp, điều duy nhất chúng ta cần làm là chuyển đường dẫn tệp làm đối số cho công cụ dòng lệnh ghc:


:!ghc hello.hs

[1 of 1] Compiling Main ( hello.hs, hello.o ) Linking hello ...

Bây giờ, nếu chúng ta tìm kiếm các tệp có tên outSourcecode, chúng ta sẽ tìm thấy ba tệp mới:


:!ls | grep 'Hello'

hello hello.hi hello.hs hello.o

  • hello.hs là tệp chúng ta đã tạo bằng mã nguồn.

  • hello.o là tệp đối tượng và hello.hi là tệp giao diện sẽ liên kết tệp đối tượng với các thư viện đi kèm với GHC để tạo tệp thực thi. Chúng ta không thực sự quan tâm đến những điều đó ngay bây giờ.

  • Cái mà chúng ta quan tâm là hello (được gọi là hello.exe nếu chúng ta biên dịch nó trên máy Windows). Đây là một thực thi acutal. Một nhị phân mà chúng ta có thể chạy giống như bất kỳ chương trình nào khác.

Vì vậy, hãy chạy nó!:


:!./Hello

Hello World!

Và bùm! Chúng ta đã biên dịch và chạy chương trình Haskell của riêng mình! Chúc mừng!

Tất nhiên, vì GHCi đi kèm với GHC, nên chúng ta cũng có thể tải tệp hello.hs lên GHCI (ghci) và chạy xung quanh với chức năng chính.

tip

GHCi REPL của Haskell cho phép bạn tải tệp Haskell bằng lệnh :l. Ở đó, việc tệp có chức năng chính hay không không liên quan. Sau khi tệp được tải vào GHCi, bạn có thể gọi bất kỳ chức năng hoặc loại nào được xác định trong tệp và kiểm tra xem chúng có hoạt động như bạn mong đợi hay không. Nếu bạn tải tệp main.hs vào GHCi để nhập một số mô-đun do người dùng xác định, chúng cũng sẽ được đưa vào trong quá trình biên dịch.

Chúng ta đã viết mã trong Haskell được một thời gian rồi. Nhưng mọi thứ diễn ra khá đơn giản và ngắn gọn. Đó là lý do tại sao, nếu bạn đang làm bài tập về nhà, chúng ta luôn viết toàn bộ mã của mình trong một tệp duy nhất.

Nhưng nếu chúng ta đang tạo một ứng dụng phức tạp hơn thì sao? Giống như một trang web, một trò chơi hay một blockchain? Tập tin đơn lẻ đó có bao nhiêu nghìn dòng mã không thể đọc được? Giải pháp ngây thơ là chia nó thành một loạt các tệp. Nhưng điều đó vẫn không giải quyết được nhiều vấn đề mà chúng ta sẽ gặp phải. Đó là lý do tại sao chúng ta sử dụng các mô-đun.

Nguồn bài viết tại đây

  • Picture