Điều gì sẽ là một dự án lập trình chức năng đầu tiên tốt? [đóng cửa]


19

Điều gì sẽ là một dự án lập trình chức năng đầu tiên tốt?

Tôi đang tìm cách hoàn thành với một tiếng nổ trong dự án cử nhân của mình và tôi muốn hoàn thành nó với một dự án lập trình chức năng. Chúng tôi đã không học nó ở trường nhưng chúng tôi được khuyến khích cố gắng tự học những điều mới và tôi nghĩ rằng việc học một mô hình mới không chỉ là một ngôn ngữ mới sẽ là một bài tập tuyệt vời cho tôi, và có lẽ cũng là một điều thú vị cho các giáo viên. .

Vấn đề là tôi muốn bắt đầu sớm hơn một chút về dự án của mình để tận dụng kỳ nghỉ hè và hiểu rõ hơn về lập trình chức năng và làm quen với một ngôn ngữ.

Bạn sẽ nói gì sẽ là một dự án thực hành tốt có một chút thách thức, nhưng cũng cho phép tôi học ngôn ngữ, mô hình, v.v. Và sau đó bạn nghĩ gì sẽ là một dự án tốt (một dự án nâng cao hơn) cho dự án cử nhân của tôi?

Đề xuất về ngôn ngữ tốt nhất để bắt đầu khi đi vào lập trình chức năng cũng sẽ được đánh giá cao.


1
"Tôi nên chọn ngôn ngữ nào" và các câu hỏi lựa chọn dự án đều không có chủ đề ở đây. Vui lòng xem FAQthảo luận meta này để biết thêm chi tiết.
Adam Lear

Câu trả lời:


10

Nói chung sẽ dễ dàng hơn nếu bạn sử dụng một cái gì đó tương đối toán học hoặc logic - ngôn ngữ lập trình chức năng thường rất phù hợp cho các ứng dụng đại diện cho một số dạng chuyển đổi từ đầu vào nhất định sang đầu ra.

Một số ý tưởng, theo thứ tự khó khăn:

  • Các thuật toán di truyền - viết một chương trình phát triển các giải pháp cho một nhiệm vụ cụ thể trong đó các giải pháp được trình bày trong một DSL đơn giản. Tôi đã có niềm vui trước khi xây dựng các bot nhỏ săn tìm thức ăn trong lưới 2D và phát triển các loại chiến lược khác nhau

  • Trình kết hợp phân tích cú pháp - xây dựng thư viện trình kết hợp trình phân tích cú pháp cho phép bạn xây dựng trình phân tích cú pháp cho ngôn ngữ tùy ý bằng cách sử dụng các hàm bậc cao hơn.

  • Nếu bạn thực sự muốn thử thách, bạn có thể thử viết một trò chơi trên máy tính ... lưu ý rằng đây là một nhiệm vụ khó khăn vì các trò chơi có một số lượng lớn trạng thái có thể thay đổi có thể khó quản lý theo kiểu lập trình chức năng. Mong đợi để tìm hiểu nhiều hơn bạn từng muốn biết về các đơn vị, vv .....

Tôi muốn giới thiệu Clojure như một ngôn ngữ chức năng thực dụng. Tôi đã sử dụng nó được khoảng 18 tháng và tôi vô cùng hài lòng với lựa chọn này. Lý do chính là:

  • Đồng thời - Clojure có một hệ thống STM tuyệt vời mà theo quan điểm của tôi làm cho nó trở thành ngôn ngữ tốt nhất trên thế giới tại thời điểm này cho đồng thời đa lõi. Xem video tại: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey nếu bạn muốn hiểu tại sao điều này lại đặc biệt như vậy
  • Đó là một Lisp - vì triết lý "mã là dữ liệu", thật tuyệt vời cho siêu lập trình dựa trên vĩ mô (các chương trình viết chương trình, thuật toán di truyền, v.v.)
  • Lập trình chức năng thực dụng - Phong cách Clojure rất chức năng (rất chú trọng vào các chức năng bậc cao hơn, các chuỗi lười biếng, v.v.) nhưng nó không hoàn toàn thuần túy như Haskell. Có rất nhiều công cụ tuyệt vời để xử lý tình trạng có thể tấn công và trạng thái phụ
  • Dynamic - Clojure là một ngôn ngữ động theo mặc định. Tôi thấy đây là một sự thúc đẩy lớn cho năng suất. Tuy nhiên, bạn có thể tùy chọn thêm các gợi ý loại tĩnh sau nếu bạn muốn các lợi ích hiệu suất của việc gõ tĩnh.
  • Được biên dịch đầy đủ - Mã Clojure luôn được tuân thủ (ngay cả khi bạn thực hiện "eval") để bạn có được hiệu suất khá tốt - chắc chắn tốt hơn hầu hết các ngôn ngữ động mà tôi đã sử dụng.
  • Bạn có quyền truy cập vào tất cả các thư viện và công cụ trong hệ sinh thái JVM miễn phí. Vì vậy, không giống như các ngôn ngữ học thuật có sẵn các thư viện rất hạn chế, bạn có thể truy cập mọi thứ trong vũ trụ Java khá dễ dàng

Bạn có thể thử những điều cơ bản rất dễ dàng với:

  • Bộ vấn đề trực tuyến 4Clojure - những vấn đề ban đầu đóng vai trò là phần giới thiệu "học bằng cách làm" tốt cho ngôn ngữ Clojure
  • REPL Clojure trực tuyến tại http://www.try-clojure.org/

Tôi chọn câu trả lời của bạn cho câu hỏi vì nó trả lời tất cả các câu hỏi của tôi. Cảm ơn bạn rất nhiều vì đã dành thời gian.
Meme

Haskell cũng có STM; (
thay thế vào

@mikera: Để làm việc với JVM, bạn đã thử ABCL chưa? Tôi đã thử nó và chỉ làm một ví dụ nhỏ nhưng tôi gần như không có kinh nghiệm với nó. (Tôi cũng có một cuốn sách Clojure trong danh sách việc cần làm của mình, nhưng đây là một câu chuyện khác. Tôi tò mò nếu bạn có bất kỳ kinh nghiệm nào khi làm việc với ABCL và Java).
Giorgio

@Giorgio: ABCL có vẻ như là một triển khai Common Lisp trên JVM. OTOH Clojure có các ưu điểm là được thiết kế cho JVM, kết hợp nhiều đổi mới "hiện đại" hơn và có nhiều động lực cộng đồng hơn. Tôi nghĩ rằng điều đó thực sự phụ thuộc vào việc bạn có quan tâm đến việc duy trì khả năng tương thích ngược Lisp chung hay không.
mikera

9

Trước khi bạn bắt đầu nghĩ về các dự án cụ thể, hãy bắt đầu với việc học các kiến ​​thức cơ bản về lập trình chức năng để bạn có thể có một ý tưởng tốt về các loại dự án sẽ phù hợp.

Nơi tốt nhất để bắt đầu có lẽ là Cấu trúc và diễn giải các chương trình máy tính (SICP), dựa trên phương ngữ Scheme của Lisp. Đây là một văn bản CS cổ điển và toàn bộ văn bản có sẵn trực tuyến (liên kết được cung cấp).

Nếu bạn muốn làm cho lạ mắt và sử dụng một ngôn ngữ chức năng hiện đại hơn nhắm vào JVM, hãy xem Clojure. Thậm chí còn có một phiên bản SICP được điều chỉnh dành riêng cho Clojure .

Đi qua văn bản SICP, bạn sẽ biết được lý do tại sao lập trình chức năng rất phù hợp với một số loại nhiệm vụ nhất định và các bài tập có thể truyền cảm hứng cho một dự án chính thức. Nếu bạn chọn đi theo con đường Clojure và muốn kiểm tra một số dự án hiện có, có một số liên kết tốt ở đây .


Cảm ơn bạn đã cung cấp các liên kết cho cuốn sách. Tôi sẽ đọc nó để hiểu rõ hơn.
Meme

Bạn đã đọc SICP của bạn ngày hôm nay?
MattyD

3

Phân tích định lượng

Nếu bạn thấy tài chính hơi thú vị khi thực hiện một số công cụ định lượng với lập trình chức năng thì rất phù hợp vì nó rất thuật toán. Tôi đang nói về lý thuyết danh mục đầu tư và những thứ như tỷ lệ sharpe và sortino, v.v. Tạo một ứng dụng phân tích lợi nhuận của quỹ và đưa ra các số liệu thống kê, sơ đồ khác nhau, v.v.

Tôi chỉ đề xuất F # vì tôi nghĩ rằng đó là một ngôn ngữ chức năng dễ dàng để bắt đầu, có các công cụ tốt và khung tốt hỗ trợ nó. Các lựa chọn thay thế khác là lisp và clojure nhưng chúng khó học hơn một chút.


Ở cấp độ cao, thực sự đúng là bạn có thể làm rất nhiều thứ một cách có chức năng. Mọi người đã sử dụng các ngôn ngữ chức năng để mô tả các khoản thanh toán tùy chọn kỳ lạ, ví dụ. Nhưng khi bạn đi xuống các công cụ cơ bản, như tính toán PCA, giải các phương trình phi tuyến, v.v., các thuật toán ngày càng lặp đi lặp lại và tốt hơn hết bạn nên mã hóa chúng theo cách cũ.
quant_dev

1
Tôi sẽ không nói rằng, theo kinh nghiệm của tôi, phân tích định lượng là tất cả về việc chạy các thuật toán qua chuỗi. Tôi đã triển khai công cụ định lượng trong C # và nó rất phù hợp với LINQ, ít nhất là đối với loại công cụ lý thuyết danh mục đầu tư
Homde

Còn việc thực hiện các thuật toán thì sao?
quant_dev

Tôi thấy không có vấn đề trong hầu hết các trường hợp, phải không? Hãy tính toán tỷ lệ sharpe, đầu tiên bạn tính lợi nhuận hàng năm từ chuỗi lợi nhuận, sau đó bạn sử dụng giá trị đó với tỷ lệ rủi ro và biến động miễn phí: (hàng nămReturn - riskFreeRate) / biến động. Không có gì một ngôn ngữ chức năng không thể xử lý
Homde

Điều gì về hiệu chuẩn mô hình định giá?
quant_dev

3

Để bắt đầu, bạn có thể thử thực hiện một trò chơi blackjack nhỏ trong F #. Đây là một dự án bài tập về nhà được chỉ định trong video hướng dẫn ngắn này . Giải pháp cũng được cung cấp trên mạng (và trong một trong các video).


2

Bạn có thể viết một trình thông dịch cho lược đồ hoặc lisp với OCaml.


Ngoài ra để lưu ý có ngay cả một cuốn sách haskell về điều này về kế hoạch viết trong haskell.
thay thế

2

Những ngôn ngữ chức năng mà bạn đã nghĩ đến. Mỗi người có một đặc điểm khác nhau. Ngôn ngữ tạo ra ảnh hưởng lớn nhất đối với tôi là Haskell và tôi sẽ đề nghị bạn làm tương tự.


Tôi đã nghĩ về F # một cách trung thực chủ yếu bởi vì ở Đan Mạch Microsoft mọi thứ đều phổ biến, nhưng càng đọc nhiều ý kiến ​​khác nhau, tôi càng nghi ngờ về quyết định này. Tôi muốn một ngôn ngữ sẽ giúp tôi học được mô hình chủ yếu, và sau khi tôi chắc chắn không khó để học một ngôn ngữ khác nếu tôi cần hoặc muốn.
Meme

Phụ thuộc rất nhiều vào nơi bạn ở và những gì bạn làm. Đối với chúng tôi, các công nghệ lập trình của Microsoft là vô dụng vì chúng không hỗ trợ nền tảng chính của chúng tôi. Nhưng tôi lạc đề: nếu bạn muốn sử dụng F #, thật tuyệt, nhưng sau đó mở một câu hỏi cụ thể về F # mới.

Tôi không muốn sử dụng nó. Tôi chưa đưa ra quyết định nào. Câu hỏi về ngôn ngữ để sử dụng là một câu hỏi phụ.
Meme

Trong trường hợp đó, tìm một dự án và sau đó yêu cầu đề xuất làm thế nào để giải quyết nó. Ví dụ Prolog là tuyệt vời cho tìm kiếm cây quyết định. Haskell là tuyệt vời cho phù hợp với mô hình. Lisp rất tốt cho việc xây dựng và thao tác các chương trình Lisp trong thời gian chạy tùy thuộc vào dữ liệu của bạn.

0

Bạn cũng có thể đóng góp cho một số dự án nguồn mở.

Ví dụ, trong dự án ngôn ngữ lập trình Frege , có rất nhiều việc phải làm. Ví dụ, bạn có thể quan tâm đến việc chuyển các thư viện Haskell cơ sở. Điều này sẽ khiến bạn trở thành một chuyên gia Haskell trong khi bạn làm việc với nó.

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.