Một đại diện nâng lên là gì?


12

Chỉ cần chạy qua thuật ngữ này ở đây:

http://www.codemesh.io/codemesh2014/viktor-klang

"Chúng tôi sẽ trình diễn API Flow, một đại diện được nâng lên, cũng như một cách có thể cắm được để chuyển đổi đại diện được nâng lên thành biểu diễn thực hiện Flow Flowization."

Googling không giúp được gì nhiều.


đề nghị đọc: Thảo luận về $ {blog}
gnat

11
@gnat có vẻ như anh ta đã không phát minh ra thuật ngữ đó, nó không giống như một ý kiến, nó không có khả năng gây ra một cuộc thảo luận và cảm giác ruột của tôi là nó sẽ không quá rộng (mặc dù cảm giác như toán học).
Den

2
Tôi thảo luận về ý nghĩa của "nâng" trong ngữ cảnh của C # tại đây: blog.msdn.com/b/ericlippert/archive 2007/06/27 / - - có thể các nhà phát triển Scala đang sử dụng thuật ngữ tương tự, nhưng nhiều hơn thời trang nói chung.
Eric Lippert

Câu trả lời:


22

Tôi không quen thuộc với API Flow.

Thuật ngữ nâng nâng hạ xuất phát từ lý thuyết thể loại. Trong các ngôn ngữ lập trình như Haskell hoặc Scala, một lifthàm có chức năng A => Bvà bằng cách nào đó thực hiện phép thuật để chức năng nâng F[A] => F[B]có thể được áp dụng cho functor hoặc monadF[A] .

Một ví dụ cụ thể sử dụng bộ Seqchứa của Scala : Giả sử chúng ta có một hàm def double(x: Int): Int = 2 * xvà một chuỗi val xs = Seq(1, 2, 3). Chúng tôi không thể double(xs)do các loại không tương thích. Nhưng nếu chúng ta có được một val doubleSeq = liftToSeq(double), chúng ta có thể làm doubleSeq(xs), mà ước tính Seq(2, 4, 6). Ở đây, liftToSeqcó thể được thực hiện như

def liftToSeq[A, B](f: A => B): (Seq[A] => Seq[B]) =
  (seq: Seq[A]) => seq.map(f)

Hàm Seq(…)tạo cũng có thể được xem như là một hoạt động nâng, nâng các giá trị 1, 2, 3thành một Seqthể hiện, do đó cho phép chúng ta sử dụng các tóm tắt danh sách cho các giá trị này.

Monads cho phép chúng tôi gói gọn các hoạt động bên trong của một số loại bằng cách cung cấp một giao diện kín nước nhưng có thể ghép lại được. Sử dụng một đại diện nâng có thể làm cho nó dễ dàng hơn để suy luận về một tính toán. Sử dụng các khái niệm trừu tượng như vậy cũng có nghĩa là chúng ta mất kiến ​​thức về các chi tiết cụ thể trừu tượng hóa, nhưng chúng cần thiết để cung cấp một triển khai hiệu quả dưới mui xe (tìm một đại diện thực thi phù hợp).


4
Đó là một mô tả tốt về "nâng" toán học. Chúng ta cũng nên bao gồm một tham chiếu đến mô tả chính thức hơn về việc nâng từ Wikipedia .
Scott Whitlock

3
Một ví dụ rõ ràng hơn về "nâng" là nâng lên các loại nullable (hoặc "tùy chọn" hoặc "có thể"). Ví dụ: giả sử bạn có một toán tử +được định nghĩa sao cho int + int --> int. Toán tử nâng lên thành nullable int? + int? --> int?có ngữ nghĩa là "nếu một toán hạng là null thì câu trả lời là null, nếu không thì sử dụng toán tử không nâng trên các giá trị".
Eric Lippert

@ScottWhitlock Bạn thậm chí còn nâng?
helrich

1
@Frank Tôi đã đọc bài viết trên Wikipedia trước khi viết câu trả lời của mình và cũng không hiểu nó. Thay vào đó, tôi thấy các Haskell Wiki trên Lifting là dễ tiếp cận hơn. Lưu ý rằng chúng tôi không thực sự có bốn loại. Chúng ta có bốn loại cụ thể, nhưng chỉ có ba biến loại: hai loại ABfunctor là hàm Ftạo kiểu.
amon

1
Tôi không quá sâu vào tất cả những điều này, nhưng nếu Flà một nhà xây dựng kiểu, thì đó F[A]là một trong những kiểu được xây dựng của nó. Vậy tại sao nói sai về bốn loại này? (dĩ nhiên hai loại và một loại xây dựng sẽ tốt như nhau)
Frank

6

Thuật ngữ để nâng tất nhiên có thể có ý nghĩa khác nhau tùy thuộc vào bối cảnh.

Trong lập trình chung, nó mô tả quá trình trừu tượng hóa lên cấp độ cao hơn tiếp theo. Ví dụ: bạn có thể có hai đoạn mã, một loại với intvà loại kia có float. Nâng mã này có nghĩa là một cái gì đó giống như tạo khuôn mẫu cho phương thức với một kiểu chung Thoạt động cho cả hai intfloat .

Tôi thấy cách sử dụng thuật ngữ này là một hướng dẫn trực quan tốt cho việc nâng có nghĩa là gì. Sự khác biệt duy nhất dường như tồn tại giữa các bối cảnh khác nhau là sự trừu tượng cao hơn này thực sự là gì.

Cụ thể, Viktor được biết đến trong bối cảnh lập trình chức năng, và trong bối cảnh này, bạn có thể tìm thấy những cách hiểu khác nhau về việc nâng ở đó. Một ví dụ, là nâng các giá trị thành functor hoặc nâng các hàm để hoạt động trên các giá trị đơn âm (tức là của Haskell liftM2).

Một ví dụ rất cụ thể về "đại diện được nâng lên" sau đó có thể f.ex. là a List(1), hoặc a Some(1).


4

Những loại khái niệm này thường dễ hiểu nhất với một ví dụ cụ thể. Hãy xem xét đoạn trích sau từ ví dụ API Flow này :

Flow(text.split("\\s").toVector).
      // transform
      map(line => line.toUpperCase).
      // print to console (can also use ``foreach(println)``)
      foreach(transformedLine => println(transformedLine)).
      onComplete(FlowMaterializer(MaterializerSettings())) {
        case Success(_) => system.shutdown()
        case Failure(e) =>
          println("Failure: " + e.getMessage)
          system.shutdown()
      }

Điều này có mã sau đây:

text.split("\\s").toVector.
      map(line => line.toUpperCase).
      foreach(println)

và "nâng" nó vào một Flowbối cảnh. Điều đó cho phép bạn sử dụng cùng một cú pháp mà bạn quen thuộc để chỉ định thuật toán của mình, nhưng đằng sau hậu trường, việc mapnày được thực hiện song song trên một số bộ xử lý hoặc thậm chí cả máy, sau đó foreach(println)thu thập liền mạch đầu ra trở lại một bộ xử lý để in.

Đây là một thuật ngữ chung có thể đề cập đến việc bọc bất kỳ bối cảnh nào xung quanh bất kỳ loại nào. Một ví dụ quen thuộc khác là maplấy một hàm hoạt động trên một phần tử duy nhất và "nâng" nó vào bối cảnh mới để làm việc trên một tập hợp các phần tử đó. Nâng rất phổ biến trong lập trình chức năng và một trong những lý do chính khiến việc sử dụng lại mã chức năng trở nên dễ dàng hơn nhiều.

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.