2010-02-22 21 views
14

"Phản chiếu đơn sắc" là gì?"Phản chiếu đơn điệu" là gì?

Tôi có thể sử dụng nó trong F # -Chương trình như thế nào?

Ý nghĩa của thuật ngữ "phản chiếu" có giống như phản xạ .NET không?

+0

Tôi muốn thực hiện một thay đổi ("readonly") bộ nhớ cache cho đệ quy f # -function. –

+1

Tôi đã xem các trang trình bày về "phản chiếu đơn sắc" một thời gian ngắn, nhưng có vẻ như chủ đề chắc chắn cần thêm thời gian! Nếu ai đó có thể đưa ra một lời giải thích breif về nó là gì, điều đó thật tuyệt vời. Tôi đoán rằng sự phản chiếu .NET là một điều khác. –

+2

Về bộ nhớ đệm không thay đổi - kỹ thuật thông thường cho bộ nhớ đệm gọi hàm là _memoization_. Nhưng điều đó sử dụng một từ điển nội bộ có thể thay đổi được. Tôi cho rằng bạn có thể làm cho nó "thuần khiết" bằng cách sử dụng một loại tiểu bang nào đó, nhưng đó có lẽ không phải là câu hỏi của bạn ... –

Trả lời

3

tôi đọc qua các hit đầu tiên của Google, một số slide:

http://www.cs.ioc.ee/mpc-amast06/msfp/filinski-slides.pdf

Từ đó, nó trông giống như

  1. Đây là không giống như NET phản ánh. Tên này dường như đề cập đến việc chuyển dữ liệu thành mã (và ngược lại, với sự sửa đổi).
  2. Mã sử ​​dụng các hoạt động thuần túy chuẩn, vì vậy việc triển khai phải dễ dàng trong F #. (một khi bạn đã hiểu nó)
  3. Tôi không biết liệu điều này có hữu ích cho việc triển khai bộ nhớ đệm không thay đổi cho một hàm đệ qui hay không. Có vẻ như bạn có thể xác định các hoạt động có thể thay đổi và chuyển đổi chúng thành các hoạt động bất biến tương đương một cách tự động? Tôi thực sự không hiểu các slide.

Oleg Kiselyov cũng có an article, nhưng tôi thậm chí còn không đọc nó. Ngoài ra còn có một bài báo từ Jonathan Sobel (et al). Hit số 5 là câu hỏi này, vì vậy tôi ngừng tìm kiếm sau đó.

+0

Tôi khuyên bạn nên đọc hai chương đầu tiên từ cuốn sách "Nền tảng cho ngôn ngữ lập trình" của John C. Mitchell ngay trước bài báo của Sobel. – ssp

8

Phản ánh đơn thuần về cơ bản là ngữ pháp để mô tả các lớp đơn lớp hoặc phân lớp đơn nguyên. Trong mô tả Haskell cũng có nghĩa là xây dựng monads. Đây là một hệ thống cấp cao hơn để mã trông giống như chức năng nhưng kết quả là thành phần đơn nguyên - có nghĩa là không có monads thực tế (không hoạt động) không có gì thực/runnable vào cuối ngày. Filinski đã làm nó ban đầu để cố gắng để mang lại một loại thi đua monad để Đề án nhưng nhiều hơn nữa để khám phá các khía cạnh lý thuyết của monads.

Correction từ bình luận - F # có một tương đương Monad tên "Computation Expressions"

Filinski's paper at POPL 2010 - không có mã nhưng rất nhiều lý thuyết, và tất nhiên là giấy ban đầu của mình 1.994-Representing Monads. Cộng với một mã có một số mã: Monad Transformers and Modular Interpreters (1995)

Ồ và đối với những người thích mã - Filinski's code là trực tuyến. Tôi sẽ liệt kê chỉ một - đi một bước lên và thấy 7 và readme khác. Cũng chỉ cần a bit of F# code tuyên bố lấy cảm hứng từ Filinski

+1

F # có monads ... http://en.wikibooks.org/wiki/F_Sharp_Programming/Computation_Expressions –

+1

Ý anh là gì Monads là không có chức năng? – TheIronKnuckle

1

Như câu trả lời trước đây liên kết mô tả, Monadic reflection là một khái niệm cho bridge call/cc style and Church style programming. Để mô tả hai khái niệm này một số chi tiết:

F# Computation expressions (= monads) được tạo với loại Trình tạo tùy chỉnh.

Don Syme có số tốt blog post about this. Nếu tôi viết mã để sử dụng một người thợ xây và sử dụng cú pháp như sau:

attempt { let! n1 = f inp1 
      let! n2 = failIfBig inp2 
      let sum = n1 + n2 
      return sum } 

cú pháp được phiên dịch sang chương trình call/cc "call-with-current-continuation" phong cách:

attempt.Delay(fun() -> 
    attempt.Bind(f inp1,(fun n1 -> 
    attempt.Bind(f inp2,(fun n2 -> 
     attempt.Let(n1 + n2,(fun sum -> 
     attempt.Return(sum)))))))) 

Tham số cuối cùng là thế hệ tiếp theo lệnh-to-be-thực hiện cho đến cuối cùng.

(lập trình Đề án kiểu.)


F # được dựa trên OCaml.

F # có ứng dụng chức năng một phần, nhưng nó cũng được đánh máy mạnh mẽ và có hạn chế giá trị.
Nhưng OCaml không có hạn chế về giá trị.

OCaml thể được sử dụng trong Giáo loại lập trình, nơi combinator chức năng được sử dụng để xây dựng bất kỳ chức năng khác (hoặc chương trình):

// S K I combinators: 
let I x = x 
let K x y = x 
let S x y z = x z (y z) 

//examples: 
let seven = S (K) (K) 7 
let doubleI = I I //Won't work in F# 
// y-combinator to make recursion 
let Y = S (K (S I I)) (S (S (K S) K) (K (S I I))) 

Church numerals là một cách để biểu diễn số với chức năng thuần túy.

let zero f x = x 
//same as: let zero = fun f -> fun x -> x 
let succ n f x = f (n f x) 
let one = succ zero 
let two = succ (succ zero) 
let add n1 n2 f x = n1 f (n2 f x) 
let multiply n1 n2 f = n2(n1(f)) 
let exp n1 n2 = n2(n1) 

Ở đây, không là một chức năng mà phải mất hai chức năng như các thông số: f được áp dụng không gian vì vậy đây đại diện cho số zero, và x được sử dụng để vận hành kết hợp trong các phép tính khác (như add). Hàm succ giống như plusOne vậy một = zero |> plusOne.

Để thực hiện chức năng, chức năng cuối cùng sẽ gọi các chức năng khác với tham số cuối cùng (x) là null.

(Lập trình kiểu Haskell.)

Trong giới hạn giá trị F # làm cho việc này trở nên khó khăn. Church numerals can be made with C# 4.0 dynamic keyword (sử dụng phản xạ .NET bên trong). Tôi nghĩ rằng có những cách giải quyết để làm điều đó cũng trong F #.

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