Category Archives: Haskell

Chương 14: Khóa kéo

Trở về Mục lục cuốn sách

Dù cho tính thuần khiết của lập trình hàm trong Haskell đem lại nhiều lợi ích, nó cũng khiến chúng ta phải giải quyết một số bài toán theo cách khác so với khi làm bằng ngôn ngữ không thuần khiết. Vì tính minh bạch về tham chiếu, một giá trị cũng tốt ngang bằng giá trị khác trong Haskell nếu chúng cùng biểu diễn một thứ.

Vì vậy nếu ta có một cây dữ liệu gồm toàn những số năm và ta muốn thay một con số trong đó thành sáu, thì ta phải bằng cách nào đó biết được chính xác số năm nào trên cây được thay đổi. Ta phải biết vị trí của nó trên cây. Trong ngôn ngữ không thuần túy, ta chỉ cần ghi lại vị trí lưu trữ của số năm đó trong bộ nhớ rồi thay đổi nó. Nhưng trong Haskell, số năm nào cũng tốt như nhau, vì vậy ta không thể phân biệt chúng dựa vào vị trí lưu trong bộ nhớ. Và ta cũng không thể thay đổi thứ gì; khi ta nói thay đổi một cây dữ liệu thì thực ra là ta lấy cây đó rồi trả lại một cây mới gần giống với cây ban đầu, chỉ hơi khác đi. Tiếp tục đọc

Advertisements

%(count) bình luận

Filed under Haskell

Chương 13: Bổ sung về Monad

Trở về Mục lục cuốn sách

Ta đã thấy các monad có thể được dùng để nhận giá trị kèm ngữ cảnh và cách áp dụng chúng cho hàm ra sao, đồng thời cách dùng >>= hoặc khối lệnh do cho phép tập trung vào bản thân các giá trị và không cần lo lắng đến ngữ cảnh như thế nào.

Ta đã gặp monad Maybe và thấy được cách nó thêm vào giá trị một ngữ cảnh về khả năng thất bại. Ta đã học monad danh sách và thấy cách nó giúp ta dễ dàng giới thiệu đại lượng không tất định vào trong chương trình. Ta cũng học được cách làm việc trong monad IO, ngay cả trước khi ta biết monad là gì! Tiếp tục đọc

3 phản hồi

Filed under Haskell

Chương 12: Một số vấn đề về Monad

Trở về Mục lục cuốn sách

Khi lần đầu tiên nói về functor, chúng ta đã thấy rằng đó là khái niệm hữu ích cho những giá trị mà ta có thể ánh xạ lên chúng. Sau đó, ta đã phát triển thêm khái niệm này bằng cách giới thiệu các functor áp dụng, vốn cho phép ta xem các giá trị thuộc kiểu dữ liệu nhất định như những giá trị gắn với ngữ cảnh và dùng các hàm thông thường lên các giá trị đó trong khi vẫn giữ được ý nghĩa của các ngữ cảnh đó.

Trong chương này, ta sẽ làm quen với monad, vốn là các functor ứng dụng được nâng cao, cũng giống như bản thân các functor ứng dụng là các functor nâng cao. Tiếp tục đọc

2 phản hồi

Filed under Haskell

Chương 11: Functor, Functor áp dụng và Monoid

Trở về Mục lục cuốn sách

Sự kết hợp của tính thuần túy, hàm cấp cao, những kiểu dữ liệu đại số được tham số hóa, và lớp trong Haskell đã cho phép ta thực hiện phép đa hình trên cấp độ cao hơn nhiều so với ở các ngôn ngữ khác. Ta không phải hình dung kiểu thuộc về một hệ thống phân cấp kiểu đồ sộ. Thay vào đó, ta nghĩ xem những kiểu đóng vai trò là gì rồi kết nối chúng lại bằng những lớp phù hợp. Một kiểu Int có thể đóng vai trò của nhiều thứ khác nhau. Nó có thể đóng vai trò của thứ so sánh ngang bằng, của thứ xếp được theo trật tự, của thứ liệt kê được, v.v.

Tiếp tục đọc

2 phản hồi

Filed under Haskell

Chương 10: Giải bài toán theo phong cách lập trình hàm

Trở về Mục lục cuốn sách

Trong chương này, ta sẽ xét một số bài toán hay và cách tư duy theo kiểu lập trình hàm để giải quyết chúng càng đẹp càng tốt. Có thể chúng tôi sẽ không giới thiệu thêm khái niệm mới nào, mà ta sẽ biểu diễn những kiến thức Haskell mới học và thực tập kĩ năng lập trình. Từng mục sẽ trình bày một bài toán riêng. Trước hết là đề bài, sau đó ta sẽ cố gắng tìm ra cách tốt nhất (hoặc ít dở nhất) để giải quyết nó.

Tiếp tục đọc

2 phản hồi

Filed under Haskell

Chương 9: Đầu vào và đầu ra

Trở về Mục lục cuốn sách

Chúng tôi đã nói rằng Haskell là ngôn ngữ lập trình hàm thuần túy. Nếu như trong ngôn ngữ lập trình mệnh lệnh bạn thường hoàn thành công việc bằng cách giao cho máy tính một loạt các bước để thực thi, thì lập trình hàm lại thiên về định nghĩa vấn đề cần giải quyết. Trong Haskell, một hàm không thể thay đổi trạng thái nào, như thay đổi nội dung của một biến (khi một hàm thay đổi trạng thái, ta nói rằng nó có hiệu ứng phụ). Điều duy nhất mà hàm có thể thực hiện trong Haskell là trả lại cho ta một kết quả nào đó dựa trên các tham số mà ta đưa cho nó. Nếu như hàm được gọi hai lần với cùng các tham số, thì nó sẽ phải trả lại cùng kết quả. Mặc dù điều này dường như bị hạn chế khi bạn đã từng lập trình theo thức mệnh lệnh, song ta đã thấy rằng thực ra đó lại là điều hay. Trong ngôn ngữ mệnh lệnh, không có đảm bảo gì với bạn rằng một hàm đơn giản mà dùng để tính những có số sẽ không gây hại làm cháy nhà bạn, bắt đi con cún của bạn và dùng củ khoai tây cào xước xe hơi của bạn trong quá trình tính toán. Chẳng hạn, khi chúng ta đang tạo lập một cây tìm kiếm nhị phân, ta không gài phần tử vào cây bằng cách sửa đổi cây ngay tại chỗ. Hàm ta viết nhằm gài phần tử vào cây tìm kiếm nhị phân thực ra sẽ trả lại một cây mới, vì nó không thể thay đổi cây ban đầu được. Tiếp tục đọc

%(count) bình luận

Filed under Haskell

Chương 8: Tự lập nên các kiểu và lớp riêng

Trở về Mục lục cuốn sách

Ở những chương trước, ta đã tìm hiểu một số kiểu và lớp chứa kiểu sẵn có trong Haskell. Trong chương này, ta sẽ học cách tự lập nên các kiểu và lớp, đồng thời khiến chúng hoạt động! Tiếp tục đọc

3 phản hồi

Filed under Haskell

Chương 7: Module

Trở về Mục lục cuốn sách

Nạp module

Trong Haskell, module là tập hợp các hàm, kiểu, và lớp chứa kiểu có liên quan. Chương trình Haskell là một tập hợp các module trong đó module chính nạp những module khác rồi dùng các hàm định nghĩa trong đó để thực hiện nhiệm vụ.

Việc chia mã lệnh vào trong nhiều module khác nhau có khá nhiều ưu điểm. Nếu một module đủ tính tổng quát, thì các hàm mà nó xuất ra sẽ có thể dùng được trong một loạt những chương trình khác nhau. Nếu mã lệnh của bạn được chia thành những nhiều module gói gọn, theo nghĩa không quá phụ thuộc vào nhau (ta cũng nói rằng chúng được ghép lỏng lẻo), thì sau này bạn có thể dùng lại chúng. Điều này giúp cho viết mã lệnh sẽ dễ quản lý hơn, khi mã lệnh được chia thành nhiều phần, mỗi phần có mục đích riêng nào đó. Tiếp tục đọc

%(count) bình luận

Filed under Haskell

Chương 6: Hàm cấp cao

Trở về Mục lục cuốn sách

Các hàm trong Haskell có thể nhận các tham số là các hàm rồi trả lại giá trị cũng là các hàm. Một hàm thực hiện một trong hai công việc trên được gọi là hàm cấp cao. Hàm cấp cao không chỉ là một phần kinh nghiệm lập trình Haskell, mà còn có thể nói chính là kinh nghiệm dùng ngôn ngữ này. Bạn sẽ nhận thấy rằng nếu muốn định nghĩa quy trình tính toán bằng cách định nghĩa cần tính thứ gì chứ không phải định nghĩa các bước thay đổi trạng thái hoặc có thể là tính lặp, thì trong những trường hợp như vậy hàm cấp cao là không thể thay thế. Chúng là công cụ mạnh giúp ta giải quyết bài toán và suy nghĩ về chương trình. Tiếp tục đọc

3 phản hồi

Filed under Haskell, Tin học

Chương 5: Đệ quy

Trở về Mục lục cuốn sách

Chào đệ quy!

Ta có nhắc đến đệ quy ở chương trước. Trong chương này, chúng ta sẽ xem xét đệ quy kĩ hơn, về lý do tại sao nó quan trọng đối với Haskell và bằng cách nào ta có thể nhanh chóng giải quyết được vấn đề một cách tinh tế bằng cách nghĩ kiểu đệ quy. Tiếp tục đọc

%(count) bình luận

Filed under Haskell