kiến thức [Event Tặng Title] JS và Functional Programming

  • Người tạo chủ đề Người tạo chủ đề cs_50i
  • Ngày bắt đầu Ngày bắt đầu

cs_50i

bố Bơ
Chào các thím,
Tôi đang viết chuỗi seri về JS thì đến đoạn Functinal Programming nên tôi tách riêng ra để ae tiện theo dõi.
________Chú ý: Topic chỉ đưa keywords lý thuyết, còn lại mỗi khi rảnh tôi sẽ đưa lên các ví dụ thực tế (Vốn được code bằng procedural/OOP) để convert nó ra FP ae cùng convert và trao đổi, cùng chia sẻ cùng code thực tế. Ae càng hứng thú code tôi cũng sẽ hứng code theo và update challenge liên tục________
Nhiều ae rất tò mò về Functinal Programming, quan điểm của tôi đã là Functinal Programming thì phải làm trên ngôn ngữ vốn nó sinh ra đã định nghĩa là theo mô hình Functinal Programming (Haskell, Erlang, Scheme...). JS hay Java hay Go bây giờ đều hỗ trợ FP nhưng bản thân vốn không phải là Functinal Programming nên mấy ngôn ngữ này nếu là lập trình FP thì sẽ thiếu đi khá nhiều ý nghĩa của FP.

Nhưng không sao, chúng ta dùng JS để biết thêm về FP cũng là cách để viết code theo cách mới. Còn lại thì mỗi một Programming paradigm được hình thành là để giải quyết vấn đề cụ thể của riêng nó. Chẳng có Programming paradigm nào giải quyết được tất cả các vấn đề. Thế nên, cá nhân tôi không theo một mô hình nào cả. Đi làm thì dự án theo mô hình nào thì làm theo mô hình ấy chứ cũng không được lựa chọn. Tôi đoán chắc các bạn cũng vậy thôi, theo FP hay OOP mà đi làm rồi, dự án nó dúi thẳng vào người mà nó là OOP thì bạn có theo FP cũng phải dẹp sang một bên và ngược lại. Vậy nên càng hiểu biết về càng mô hình càng tốt. Chính vì thế mà trong chương trình đạo tạo ngành CNTT các trường ĐH phần lớn có môn hoặc nhánh môn các mô hình lập trình. Nếu nó là đồ thừa thì nhà trường cũng chẳng dạy làm gì, đúng không?

Vậy với Functinal Programming bạn cần biết những kiến thức nào. Tôi sẽ liệt kê ra những từ khóa điển hình. Bạn tự tra google về khái niệm, cách sử dụng. Còn trong topic này chúng ta sẽ đi vào các ví dụ cụ thể chứ không lan can lý thuyết (mọi thứ trên mạng đã quá đầy đủ và chi tiết rồi).

1. Maths
Nói thẳng ra nếu theo FP mà không có nền tảng về toán học thì có học và làm cũng chẳng đi đến đâu ngoài việc làm được vài ví dụ con con, hiểu biết sơ sơ thôi vì FP là cách mà chúng ta sẽ lập trình mà tư duy là dùng toán để giải quyết. Khác với PP hay OOP các bạn sẽ chỉ dẫn HOW TO cho máy tính làm việc, còn FP là WHAT I/O (Cho vào cái gì, trả về cái gì) để giải quyết bài toán. Với FP không hẳn bạn phải biết tất thảy về toán mà chỉ cần tập trung vào:
  • Function theory (lý thuyết về hàm)
  • Category theory (Lý thuyết phạm trù).
  • Lambda calculus (phép tính Lambda).
  • Mathematical induction (quy nạp).
  • Logic.
  • Cơ bản về lý thuyết đồ thị.
  • Programming and Mathematical Thinking.
Toán rất thú vị nhưng do chủ nghĩa toán học hình thức ở Việt Nam là chủ chốt thành ra ngay cả các học sinh, sinh viên chuyên toán khi chuyển sang học lập trình cũng phải học lại toán theo chủ nghĩa toán học thực tiễn. Vì thế, bạn tìm hiểu những thứ trên kia không nên đi sa đà vào học kiểu hình thức mà sẽ là hiểu bản chất và nắm bắt nó đang ứng dụng thực tế ra sao trong các vấn đề cụ thể. Cái này là kết luận theo kinh nghiệm 5 năm học toán tin tôi đã trải qua. Thời sinh viên tôi học điên cuồng toán học hình thức để cố gắng vượt qua môn và tốt nghiệp, ra trường và đi làm tôi thấy rất khó để áp dụng kiểu toán hình thức ấy vào công việc. Đành phải học lại theo mô hình thực tiễn. Mà toán học thực tiễn lại rất dễ học và lôi cuốn. Bạn hãy tin tôi đi :)

OK chúng ta đã có các keywords về Maths, giờ là chi tiết các keywords của FP.

Về cơ bản, bạn sẽ cần biết về:
  • First-class functions and lambdas
  • Function composition
  • Higher-order functions
  • Immutable data
  • side effect
  • Constructing and destructuring
  • Functional dependencies
  • Recursion

Nâng cao hơn sẽ là:
  • Pattern matching
  • Folds and unfolds
  • Functor, monad
  • persistent data structures
  • Rank-N types
  • Codata in action
  • comonad
  • Advanced monads (continuation, logic)
  • Advanced functors (exponential, profunctors, contravariant)
  • Higher-order abstract syntax
  • High performance
  • Kind polymorphism
  • Generic programming
  • Type-level programming
  • Dependent-types, singleton types
  • Graph reduction

ok từng này là đủ bạn oanh tạc FP rồi nhé! Hãy đặt ra các bài code thử thách convert từ PP, OOP sang FP bằng JS. Bạn sẽ nhanh chóng tiếp cận sâu hơn về FP, đây cũng là concept của topic này. Mỗi khi rảnh rang mình sẽ đăng các thử thách code JS bằng FP lên để chúng ta cùng giải phẫu :p

Ok myfen
 
Sửa lần cuối:
Đối với mình thì việc sử dụng FP (mình dùng Scala) không chỉ giúp cho mình có thêm một lựa chọn về ngôn ngữ, mà còn giúp mình thay đổi tư duy, cách viết code trong những ngôn ngữ mà mình đã biết (như java). Những cái mình học được như là cách viết code "declarative" hơn, tư duy về kiểu và generic, pure function, hạn chế reassign variable, etc.
Thành ra mình luôn khuyến khích các bạn nên học thêm những ngôn ngữ (hoặc cách thức lập trình) mà giúp mình thay đổi tư duy dù có thể bản thân ngôn ngữ đó chưa phổ biến hoặc chưa dùng tới trong công việc hàng ngày của bạn.
 
Tôi đã cho một bài đơn giản nhưng demo vô cùng cồng kềnh để ae convert cách làm khác đơn giản hơn...mà chưa thấy ai giải :rolleyes:

Gợi ý: Ae thấy cái đống này ta dùng một hàm số gom lại được chứ?
JavaScript:
var inputs = new Array();
      inputs[0] = document.getElementById('first').value;
      inputs[1] = document.getElementById('last').value;
      inputs[2] = document.getElementById('email').value;
      inputs[3] = document.getElementById('uid').value;
      inputs[4] = document.getElementById('password').value;
      inputs[5] = document.getElementById('confirm').value;
      var errors = new Array();
      errors[0] = "<span style='color:red'>Please enter your first name!</span>";
      errors[1] = "<span style='color:red'>Please enter your last name!</span>";
      errors[2] = "<span style='color:red'>Please enter your email!</span>";
      errors[3] = "<span style='color:red'>Please enter your user id!</span>";
      errors[4] = "<span style='color:red'>Please enter your password!</span>";
      errors[5] = "<span style='color:red'>Please confirm your password!</span>";
 
Góp ý bác thớt là bác nói về FP mà như không nói vậy. Đọc bài mà như cưỡi ngựa xem hoa ý
Y8aLVdj.png

Ko biết bác viết hướng đến là đối tượng nào?
  • Ae đã có base js nhưng không biết về FP?
  • Ae làm thành thạo FP nhưng lại chỉ ở ngôn ngữ khác như Erlang?
  • Hay là ae đã thành thục FP với js, đang dùng elm làm project?
  • Hay biết tí ti gì về js hay FP?

P.S: link cho ai muốn đọc qua về FP nhé https://kipalog.com/tags/Functional Programming

Btw, quan điểm của mình thì dùng FP trong js overkill quá, chỉ cần dùng một số concept đơn giản như pure function, hoặc Immutability là được rồi. FP chỉ thật sự tỏa sáng khi xài erlang hay haskell thôi, nếu giới thiệu FP với các ngôn ngữ này mới hay này.
sC5StBI.png
Là vì topic này tôi không có mục đích viết về FP. Chỉ là một topic tôi tách ra khỏi topic seri hướng dẫn học JS, đến đoạn FP trong Javascript do nó lan can lý thuyết và không phải nội dung chủ đạo trong seri và cần giới thiệu về các ví dụ cụ thể nên tôi tách ra cho đỡ loãng topic kia. Cậu k theo dõi thì thôi góp ý thì phải cho chuẩn ok?

Còn tôi nói luôn cái link https://kipalog.com/tags/Functional Programming cậu giới thiệu viết về FP với JS cũng là cưỡi ngựa xem hoa thôi. K thể lột tả được FP đâu mà khoe ra làm gì
 
Là vì topic này tôi không có mục đích viết về FP. Chỉ là một topic tôi tách ra khỏi topic seri hướng dẫn học JS, đến đoạn FP trong Javascript do nó lan can lý thuyết và không phải nội dung chủ đạo trong seri và cần giới thiệu về các ví dụ cụ thể nên tôi tách ra cho đỡ loãng topic kia. Cậu k theo dõi thì thôi góp ý thì phải cho chuẩn ok?

Còn tôi nói luôn cái link https://kipalog.com/tags/Functional Programming cậu giới thiệu viết về FP với JS cũng là cưỡi ngựa xem hoa thôi. K thể lột tả được FP đâu mà khoe ra làm gì
event tặng title mà ông viết kiểu gì k hiểu? tui tưởng chia sẽ kiến thức FP, bay vào quang8 đoạn code kêu giải? giải kiểu mẹ nào?

mún tách thì ghi vào là cần A B C để đọc topic chứ?
 
Ok, đã hiểu. Topic này là chủ thớt đưa đề -> giải bằng FP.

Nói chung topic này ko phải là nói về lý thuyết mà đi vô thực hành.

Đơn giản là thế.

Các thím bình tĩnh khi trao đổi, ko nên vì việc nhỏ gây xích mích và chửi nhau nó mất hay, thế nhé.

Còn nội dung vậy có tính ko, mình nghĩ là tính, vì chủ thớt sẽ giải bài, đưa ra solution chứ ko phải vứt cái đề lên rồi bỏ đó. Mình thấy vậy ok, có nhiều cách và nhiều kiến thức để chia sẻ với nhau.

Chủ thớt ghi rõ cái đó ở ngay đầu topic luôn cho mấy bạn khác khỏi thắc mắc.
 
Ok, đã hiểu. Topic này là chủ thớt đưa đề -> giải bằng FP.

Nói chung topic này ko phải là nói về lý thuyết mà đi vô thực hành.

Đơn giản là thế.

Các thím bình tĩnh khi trao đổi, ko nên vì việc nhỏ gây xích mích và chửi nhau nó mất hay, thế nhé.

Còn nội dung vậy có tính ko, mình nghĩ là tính, vì chủ thớt sẽ giải bài, đưa ra solution chứ ko phải vứt cái đề lên rồi bỏ đó. Mình thấy vậy ok, có nhiều cách và nhiều kiến thức để chia sẻ với nhau.

Chủ thớt ghi rõ cái đó ở ngay đầu topic luôn cho mấy bạn khác khỏi thắc mắc.
ok mod, để tôi đính chính lên đầu Topic
 

Thống kê chủ đề

Ngày tạo
cs_50i,
Người trả lời cuối
cs_50i,
Trả lời
9
Lượt xem
2.851
Quay lại
Lên đầu trang