Chức năng như một ngôn ngữ đầu tiên


Câu trả lời:


16

Một vấn đề lớn là nếu bạn bắt đầu với một ngôn ngữ như Haskell, mọi thứ khác sẽ có vẻ không đạt chuẩn.

Thành thật tôi nghĩ rằng bắt đầu với một ngôn ngữ như Haskell hoặc chương trình sẽ là một ý tưởng tuyệt vời.

(Tôi thừa nhận tôi là người nghiện ngôn ngữ chức năng) EDIT:

OK những gì tôi thích về cả hai ngôn ngữ:

Scheme lấy một ngôn ngữ rất đơn giản và xây dựng từ đó một ngôn ngữ mạnh mẽ tuyệt vời để phát triển. Ngoài ra SICP được viết về chương trình làm cho nó đáng để học hỏi ngay tại đó. Lược đồ là về điều đơn giản nhất bạn có thể tưởng tượng đó có thể là một ngôn ngữ hoàn chỉnh.

Haskell Điều thực sự phát triển đối với tôi là hệ thống loại. Vì vậy, nhiều lỗi tôi thấy trong các ngôn ngữ khác là do loại sai xuất hiện ở đâu đó. Trong Haskell đó là gần như có thể áp đặt. Ngoài ra ý tưởng về một ngôn ngữ lười biếng chỉ có một số thứ hay ho rơi ra khỏi nó. Ví dụ: bạn có thể tạo cấu trúc dữ liệu vô hạn trong Haskell và sau đó chỉ tạo phần bạn cần.


Công bằng mà nói, cả một loạt các ngôn ngữ đang kết hợp ngày càng nhiều khía cạnh chức năng, vì vậy cuộc sống không tệ như trước đây.
Tikhon Jelvis

Đúng, và đối với một người yêu thích FP thì điều này không có gì ngoài một điều tốt
Zachary K

3
Tôi biết - tôi đề nghị đây là một lý do tốt để học FP trước tiên. Đó là một xu hướng khiến tôi thực sự hạnh phúc trong một thời gian.
Tikhon Jelvis

Tuy nhiên, không thực sự nói nhiều để trả lời câu hỏi - tại sao bạn thích Haskell (hoặc Scheme)? Họ sẽ tốt như ngôn ngữ đầu tiên cho việc học? Tại sao?
jimwise

Đã thêm một số nhận xét về cả hai ngôn ngữ
Zachary K

6

Điểm cộng lớn nhất của việc học ngôn ngữ chức năng trước khi học lang OOP là kỹ năng lập trình của bạn được phát triển trước tiên và sau đó bạn có thể dễ dàng nắm bắt các khái niệm OOP. Nếu bạn bắt đầu với một ngôn ngữ OOP, bạn sẽ phải học hai điều một cách đồng thời: "nghĩ về mã" và "nghĩ về OOD". Nó có thể bị phân tâm. Đầu tiên thực hành với một ngôn ngữ chức năng và phát triển kỹ năng lập trình của bạn. Sau đó học OOP và các mô hình khác. Vì OOP đã mong muốn bù đắp những thiếu sót trong lập trình cấu trúc, nên sẽ dễ hiểu hơn tại sao. Đó là lý do các khóa học CS bắt đầu với C và sau đó chuyển sang C ++.


1
Tại trường đại học của tôi, lần đầu tiên chúng tôi bắt đầu với một ngôn ngữ chức năng, Standard ML và tìm hiểu tác dụng phụ là gì. Sau đó chúng tôi học C nhưng chúng tôi không bao giờ học C ++.
Jonas

@Jasas. Tôi đoán các quốc gia / trường đại học khác nhau có cấu trúc khóa học rất khác nhau. Trong trường đại học của tôi, C theo sau là C ++ là một tiêu chuẩn cho các khóa học Comuter Science Engg nhưng đối với các luồng kỹ thuật khác, chỉ có C được dạy.
DPD

Tại trường đại học của tôi, chúng tôi bắt đầu với Java và sau đó chỉ sử dụng ngôn ngữ phù hợp cho các khóa học sau đó. Ví dụ: C / C ++ được sử dụng để lập trình hệ thống, C # cho UI, các ngôn ngữ lắp ráp khác nhau cho tổ chức máy tính và tôi nghĩ bất cứ điều gì bạn muốn cho lập trình trò chơi
Carson Myers

Tại trường đại học của tôi, chúng tôi bắt đầu bằng cách học Scheme (với SICP). Vài tuần đầu tiên hoàn toàn hoạt động; OOP đã được giới thiệu tốt vào khóa học. Tôi nghĩ rằng tất cả được đặt ra rất tốt và thích khóa học.
Tikhon Jelvis

6

Về câu hỏi làm thế nào để học lập trình bằng cách bắt đầu với lập trình chức năng, hai khuyến nghị cổ điển:

  • Đầu tiên, và rõ ràng là Cấu trúc và diễn giải cổ điển của các chương trình máy tính , bởi Abelson và Sussman, vẫn là một trong những lời giới thiệu tốt nhất về CS ngoài kia, và được dạy từ góc độ chức năng, sử dụng Scheme. Nó có sẵn đầy đủ trực tuyến . Nếu bạn không bắt đầu ở đây, bạn nên đến đây như một số điểm.

  • Một văn bản gần đây bao trùm hầu hết các nền tảng với tốc độ nhẹ nhàng hơn và tập trung mạnh mẽ hơn vào công nghệ phần mềm là Cách thiết kế chương trình , bởi Matthew Felleisen và một nhóm người khác từ nhóm Vợt / PLT, sử dụng phương ngữ Vợt Kế hoạch. Nó cũng có sẵn trực tuyến , như là phiên bản thứ hai đang tiến hành . Cuốn sách này có lợi thế là nó được thiết kế để sử dụng với môi trường lập trình DrRacket, cung cấp giao diện rất thân thiện cho người mới bắt đầu và chuyên gia để thử nghiệm mã.

Về câu hỏi tại sao bắt đầu với lập trình chức năng, tôi muốn chỉ vào Blog của Bob Harper . Carnegie Mellon gần đây đã trang bị lại chương trình giảng dạy CS của họ để dạy lập trình chức năng trước tiên và Harper đã đưa tin về tiến trình của họ trên blog của mình. Là một trong những kẻ đứng sau định nghĩa về ML tiêu chuẩn, rõ ràng anh ta cho động thái này và anh ta lập luận lý do cho việc này tốt.

Cuối cùng, tôi thận trọng trước việc học Haskell trước, mặc dù những người khác có thể không đồng ý. Mặc dù cách tiếp cận thuần túy của Haskell đối với FP chắc chắn sẽ tạo ra những thói quen tốt, ngôn ngữ tập trung vào tính toán lười biếng không nhất thiết phải là một kết hợp tốt cho người mới bắt đầu; một trong những điều đầu tiên và quan trọng nhất bạn cần học làm lập trình viên là suy luận về chính xác những gì chương trình của bạn đang làm bằng cách xem nguồn và về chi phí tương đối của các cách tiếp cận khác nhau cho cùng một vấn đề. Tôi là kinh nghiệm của tôi rằng sự lười biếng của Haskell làm cho cả hai hoạt động này phần nào trở thành một thách thức đối với các lập trình viên thậm chí có kinh nghiệm, mặc dù Mileage của bạn có thể khác nhau.


5

Ưu điểm chính (hoặc, không bất lợi) khi bắt đầu với FP là hầu hết các khái niệm cũng có thể áp dụng cho lập trình mệnh lệnh. Realm of Rquet sử dụng các phép tương tự trò chơi video để dạy cả các khái niệm chức năng và mệnh lệnh, và các sinh viên tận tâm không chỉ có một trò chơi chức năng (npi), mà còn hiểu biết sâu sắc về các điều kiện, đệ quy, vòng lặp, ADT và thiết kế theo hướng sự kiện. Những khái niệm này thực tế có mặt khắp nơi trong lập trình hiện đại và được sử dụng liên tục.

Tuy nhiên, điều quan trọng hơn là học cách mã hóa trừu tượng , một cái gì đó trong đó FP vượt trội, với việc sử dụng các hàm và kiểu dữ liệu bậc cao. Làm thế nào để thiết kế chương trình có một cách tiếp cận độc đáo cho việc này bằng cách giảng dạy thông qua quy nạp. Ví dụ, sinh viên học cách làm foldviệc bằng cách xem mã để lấy cả tổng và sản phẩm của danh sách, tìm điểm chung của họ và tự mình thực hiện việc thực hiện.

Tương đương OOP ở trên có thể liên quan đến một hoặc nhiều điều sau đây: giao diện, lớp trừu tượng, khái quát, functor hoặc (nếu bạn làm sai) các singletons. Mặc dù đây là các mẫu thiết kế hoàn toàn có thể chấp nhận được trong Java, IMHO chúng không thuộc về một chương trình giới thiệu và chỉ phục vụ để làm xáo trộn các nguyên tắc cơ bản. Ngay cả khi một người được giới thiệu ngôn ngữ FP "muộn", tôi có thể nói rằng việc điều hướng biển OOP luôn thay đổi đã trở nên dễ dàng hơn rất nhiều nhờ có một mỏ neo chức năng mạnh mẽ.


Hầu như quên mất: nếu bạn muốn mua Realm of Rquet, hãy thử phiếu giảm giá này : RACKETEERS. Không chắc chắn khi nó hết hạn, xin lỗi.
lỗi

+1 để đề cập đến các hàm bậc cao hơn - Tôi đã sẵn sàng đăng câu trả lời của riêng mình về chúng. Một nửa đồng nghiệp của tôi đấu tranh với khái niệm này, và những người còn lại khiến họ không nghĩ về họ khi đó sẽ là giải pháp đơn giản nhất.
Izkata

1
Tôi chưa từng nghe về Realm of Rquet, nhưng từ tiêu đề ngay lập tức biết nó là gì, bởi vì tiêu đề này liên quan đến người anh em của nó, Land of Lisp.
Magus

4

Lập trình chức năng làm cho mọi thứ dễ dàng hơn nhiều. Trong các ngôn ngữ OOP, bạn phải xử lý trạng thái quản lý trên nhiều luồng mà không làm hỏng trạng thái đó. Trong các ngôn ngữ chức năng, khi phần lớn công việc đang được thực hiện bằng các hàm thuần túy, bạn không phải lo lắng về nó.

Về tốc độ / hiệu suất, tôi không phải là một tay đua hiệu suất thực sự, nhưng hoạt động không có nghĩa là chậm và cấu trúc của các ngôn ngữ chức năng không ảnh hưởng nhiều đến tốc độ của chúng. Cú pháp của các ngôn ngữ chức năng rất khác nhau, chẳng hạn như sự khác biệt giữa Clojure và Haskell. Clojure rất nhanh, và có thể đạt (và đôi khi vượt quá) tốc độ của Java với tối ưu hóa sau thực tế.

Vì vậy, tất cả thực sự phụ thuộc vào những gì bạn đang tìm kiếm


2

Tôi nghĩ rằng sự sẵn có của tài liệu học tập, một số mẫu mã tốt và người cố vấn là rất quan trọng khi học ngôn ngữ lập trình. Tùy thuộc vào tình huống của bạn, bạn có thể có một người cố vấn có thể dạy bạn, v.v. nhưng tôi nghĩ tài nguyên ngôn ngữ chức năng rất ít so với các ngôn ngữ chính. Nó có nghĩa là bạn sẽ tiến bộ chậm hơn so với việc học các ngôn ngữ chính. Nhưng nếu bạn không vội, thì đây không phải là vấn đề.


1
Tôi nghĩ rằng giả định của bạn là sai. Có những hướng dẫn tốt, sách, giấy tờ, vv về những thứ chức năng. Hơn nữa, có rất nhiều bài báo ngoài kia liên quan đến những thứ đặc biệt như hệ thống loại, triển khai, máy ảo, tính toán lambda, v.v.
Ingo

1

Có lẽ lý do quan trọng nhất để xem xét việc học ngôn ngữ lập trình chức năng là sự hiểu biết về các kiểu dữ liệu đại số. Bản đồ tinh thần sẽ giúp mô hình hóa các mối quan hệ lớp OO và thậm chí thiết kế cơ sở dữ liệu.

Việc tập trung vào các hệ thống đa lõi / đa bộ xử lý nhấn mạnh việc sử dụng các thuật toán song song có thể được thể hiện rõ ràng và chính xác hơn trong FP. Chi nhánh ngôn ngữ lambda có thể sẽ thấy sự gia tăng mạnh mẽ trong sử dụng trong một đến hai thập kỷ tới.

Nhưng cũng có một số cạm bẫy phổ biến. Để tin rằng FP đơn giản hơn là một sai lầm lớn, vì việc tính toán độ phức tạp của không gian và thời gian cũng như việc đưa ra bằng chứng tạm dừng có thể khó khăn hơn nhiều trong phép tính lambda, đặc biệt là trong các ngôn ngữ hỗ trợ đánh giá lười biếng.

Vì vậy, học cả hai! Hoặc có lẽ tốt hơn: đầu tiên học một ngôn ngữ bao gồm cả hai, như Scala. Nếu bạn không quan tâm đến áo phông tie-die và giọng Hà Lan nhẹ, có lẽ bạn sẽ thấy các bài giảng FP của Tiến sĩ Erik Meijer hữu ích, có trên MSDN.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.