2009-09-17 19 views

Trả lời

1

đệ quy. Khó khăn để quấn quanh đầu của bạn xung quanh nó vào những thời điểm

+5

Thật vậy. Xem câu trả lời này tại đây: http://stackoverflow.com/questions/1438558/what-techniqie-in-functional-programming-is-difficult-to-learn-but-useful-afterwa/1438569#1438569 – skaffman

+0

laugh(); void laugh() {print ("ha"); cười(); } Mặc dù điều này sẽ dẫn đến một cái gì đó giống như tên của trang web này cuối cùng; ^) – Toad

+0

Không nếu ngôn ngữ của bạn hỗ trợ đệ quy đuôi.;) – mipadi

6

tôi sẽ nói First-class functions.

Trong khoa học máy tính, ngôn ngữ lập trình được cho là hỗ trợ chức năng hạng nhất (hoặc chức năng literals) nếu nó xử lý chức năng là đối tượng hạng nhất. Cụ thể, điều này có nghĩa rằng ngôn ngữ hỗ trợ xây dựng chức năng mới trong thực hiện một chương trình, lưu trữ chúng trong cấu trúc dữ liệu, đi qua chúng như đối số cho các chức năng khác, và trở về chúng như các giá trị của chức năng khác. Khái niệm này không bao gồm bất kỳ phương tiện nào bên ngoài ngôn ngữ và chương trình (lập trình meta), chẳng hạn như gọi trình biên dịch hoặc hàm eval để tạo một hàm mới.

+0

Nó có hữu ích không? o_O –

+0

không chỉ hữu ích mà còn mạnh mẽ. Ví dụ bạn có thể mô phỏng OOP ngay cả khi ngôn ngữ không hỗ trợ nó. Xem ví dụ: http://javascript.crockford.com/prototypal.html –

+2

Không thực sự khó khăn, theo ý kiến ​​của tôi ... Monads chắc chắn là một đơn đặt hàng của cường độ khó hơn ... – em70

8

gói đầu của tôi xung quanh tiếp tục phong cách đi qua đã giúp javascript tôi mã hóa rất nhiều

1

Khái niệm về hàm bậc cao, hàm lambda và sức mạnh của thuật toán chung dễ kết hợp rất có lợi cho tôi. Tôi luôn vui mừng khi tôi thấy những gì tôi có thể làm với một lần trong haskell. Tương tự như vậy lập trình của tôi trong C# đã thay đổi rất nhiều (tốt hơn, tôi hy vọng) kể từ khi tôi nhận được vào lập trình chức năng (haskell đặc biệt).

6

Bạn có muốn đo lường tính hữu ích liên quan đến chương trình hoặc lập trình chức năng nói chung không?

Nói chung, những kinh nghiệm tích cực của lập trình chức năng không phát sinh từ các kỹ thuật đặc biệt nhưng từ cách nó thay đổi suy nghĩ của bạn -

  • Giữ dữ liệu bất biến
  • Xây dựng khai báo (đệ quy, mô hình khớp)
  • Chức năng xử lý dưới dạng dữ liệu

Vì vậy, tôi muốn nói rằng lập trình hàm là câu trả lời cho câu hỏi của bạn.

Tuy nhiên, để đưa ra một câu trả lời cụ thể hơn nữa, tôi muốn bỏ phiếu cho cơ chế trừu tượng chức năng như

  • monads
  • arrows
  • tiếp-qua-style
  • zippers
  • higher- order-functions
  • generics + typeclasses.

Như đã nói, họ rất trừu tượng thứ trên quan điểm đầu tiên, nhưng một khi bạn đã hiểu họ, họ là những kỹ thuật cực kỳ mát mẻ và từ có giá để viết súc tích, lỗi an toàn và cuối cùng nhưng không kém phần quan cao tái sử dụng mã.

Hãy so sánh như sau (giả):

// Concrete 
def sumList(Data : List[Int]) = ... 

// Generic 
def sumGeneric[C : Collection[T], T : Num](Data : C) = ... 

Sau đó có thể là hơi unintuitive so với định nghĩa đầu tiên, nhưng nó cho phép bạn làm việc với bất kỳ bộ sưu tập và gõ số nói chung!

Tất cả trong tất cả, nhiều ngôn ngữ hiện đại (chính thống) đã phát hiện ra những lợi ích như vậy và giới thiệu các tính năng rất chức năng như lambda functios hoặc Linq. Việc hiểu những kỹ thuật này cũng sẽ cải thiện mã viết bằng ngôn ngữ này.

+0

Tôi đồng ý với năm đề xuất đầu tiên của bạn, nhưng # 6 (generics) không dành riêng cho các ngôn ngữ lập trình chức năng - ngay cả ví dụ: Java hỗ trợ các tham số kiểu với các giới hạn và do đó có thể biểu diễn sumGeneric của bạn giống như trên. –

3

Một từ bộ phận "nâng cao": Lập trình với các loại ma (đôi khi còn được gọi là các loại được lập chỉ mục). Nó được thừa nhận không phải là một kỹ thuật "tiêu chuẩn" trong lập trình chức năng nhưng không hoàn toàn bí truyền, và đó là một cái gì đó để giữ cho bộ não của bạn bận rộn trong một thời gian (bạn yêu cầu một cái gì đó khó khăn, phải không?;)).

Tóm lại, đó là về việc tham số hóa các loại để mã hóa và thực thi tĩnh một số thuộc tính nhất định tại thời gian biên dịch. Một trong những ví dụ tiêu chuẩn là hàm bổ sung vectơ đảm bảo tĩnh cho hai vectơ có độ dài N và M sẽ trả về một vectơ có độ dài N + M hoặc nếu không bạn sẽ gặp lỗi thời gian biên dịch. Có, có nhiều ứng dụng thú vị hơn.

Những kỹ thuật này không hoàn toàn hữu ích trong C++ vì chúng có ngôn ngữ lập trình chức năng thích hợp, nhưng đến nay tôi đã quản lý một số công cụ này trong tất cả các dự án gần đây của tôi ở mức độ khác nhau, gần đây trong một ngữ cảnh C++ EDSL, nơi nó làm việc rất tốt. Bạn không nhất thiết phải mã hóa các công cụ ưa thích, việc học này đã giúp tôi nắm bắt các tình huống trong đó một vài loại thẻ có thể làm giảm độ dài của EDSL hoặc cho phép một cú pháp rõ ràng hơn, ví dụ.

Phải thừa nhận rằng, tính hữu ích bị phần nào hạn chế bởi hỗ trợ ngôn ngữ và những gì bạn đang cố gắng đạt được.

Một số người mới bắt đầu:

Generic and Indexed Type (slides with some brief applications overview)

Fun with Phantom Types

Các giấy Kennedy và Russo được đề cập trong slide là Generalized Algebraic Data Types and Object Oriented Programming và đặt một số công cụ này vào bối cảnh của C#/Java.

Chương 3 trong sách của Dave Abraham C++ Template Metaprogrammingavailable online as sample chapter và sử dụng các kỹ thuật này trong C++ để phân tích chiều.

Một dự án FP thực tế sử dụng các loại ma là HaskellDB.

Các vấn đề liên quan