2016-08-14 16 views
5

Tôi chỉ mới bắt đầu làm việc thông qua cuốn sách Tamizhvendan S' F # Ứng dụng và đã xem qua đoạn mã này:Loại kiểu này là gì?

type WebPart = Context -> Async<Context option> 

Tôi đã nhìn qua của Microsoft F # docs cũng như yêu thích F # trang web của tôi, Scott Wlaschin của F# for Fun and Profit nhưng đã không thể tìm thấy bất kỳ tham chiếu đến loại hình này. Nó không có vẻ giống như một loại bản ghi. Nó gần như có vẻ giống như một chức năng cũ đơn giản. Vậy đo la cai gi?

Cảm ơn bạn đã giúp đỡ mọi người.

+3

Đây là chữ viết tắt loại cho hàm. –

+0

Vì vậy, trong trường hợp này, 'WebPart' này có một' Ngữ cảnh' và chỉ đơn giản là kết thúc cả một phép tính 'Lựa chọn' và 'Async' xung quanh nó? –

+0

Nó có thể làm bất cứ điều gì - nó không phải là một định nghĩa chức năng - chỉ là một tiện lợi cho việc viết chú thích kiểu. –

Trả lời

12

Loại WebPart bạn đang xem đến từ Suave. Bạn có thể đọc thêm về nó tại https://suave.io/async.html, nhưng tôi sẽ tóm tắt. Bạn chính xác: nó một loại cho một hàm. Cụ thể, nó là một hàm cần có một Context (mà trong Suave là sự kết hợp của một bản ghi yêu cầu HTTP và một bản ghi phản hồi), và trả về một Context option không đồng bộ. Đó là, vì một số yêu cầu có thể thất bại, hàm có tùy chọn trả về None thay vì giá trị. Và vì một số yêu cầu có thể mất nhiều thời gian, tất cả các yêu cầu được coi là trả về không đồng bộ, do đó, Async.

Để ghép hai yêu cầu lại với nhau, Suave cung cấp toán tử liên kết >=> để bạn không phải trải qua bản mẫu soạn sẵn của việc nhập async { match result1 with None -> None | Some x -> return! request2 x mọi lúc; thay vào đó, bạn chỉ có thể nhập request1 >=> request2 cho cùng một hiệu ứng.

Nếu bạn cần thêm trợ giúp và đọc qua tài liệu Suave chưa cung cấp trợ giúp bạn cần, hãy cho chúng tôi biết và chúng tôi sẽ cố gắng giải thích thêm.

+1

Cảm ơn sự giúp đỡ! Những gì tôi đã thấy, đến nay của Suave đã được khá gần với loạt bài viết * Railyway định hướng hàng ngày * Lập trình của Scott Wlaschin. –

+1

Thông tin chi tiết hữu ích! Nó thực sự là cùng một khái niệm như ROP, vì có một con đường "thành công" và một con đường "thất bại", nhưng có thêm một Async ném vào. Nhưng đó là điều tuyệt vời về lập trình chức năng: khái niệm cơ bản mang vào nhiều tình huống.Khái niệm "bind" từ ROP cũng áp dụng cho 'Async 'giống như nó áp dụng cho kiểu kiểu' Success'/'Failure' kiểu ROP. Tìm hiểu một khái niệm và bạn có thể áp dụng nó ở mọi nơi. – rmunn

3

Quá dài để nhận xét. Và tôi chưa bao giờ sử dụng Suave. Tuy nhiên, tôi nghĩ rằng tôi có thể đoán từ các tính chất đơn điệu của các loại có liên quan rằng >=> không phải là toán tử liên kết, mà là toán tử tổng hợp Kleisli. Nếu không quan sát monad laws hoặc cố gắng tìm hiểu category theory, chỉ bằng cách giả chữ ký là:

val (>>=) : 
    Async<'a option> -> ('a -> Async<'b option>) -> Async<'b option> 
val (>=>) : 
    ('a -> Async<'b option>) -> ('b -> Async<'c option>) -> 'a -> Async<'c option> 

Nhà điều hành bind mất một Async<'a option> và biến đổi nó bằng cách của một hàm binder 'a -> Async<'b option> thành một Async<'b option>. Toán tử Kleisli soạn hai hàm binder thành một phần ba.

Các nhà khai thác này đang làm việc trên các loại đơn lẻ và chức năng chung chung hơn các loại cụ thể được mô tả bằng loại viết tắt như type WebPart = Context -> Async<Context option>. Việc thực hiện các toán tử sau gần như tự nhiên.

let (>>=) request1 binder = async { 
    let! result1 = request1 
    match result1 with 
    | None -> return None 
    | Some x -> return! binder x } 

let (>=>) f g a = f a >>= g