Trong F #, nhiều hàm có chuỗi có chuỗi là thông số cuối cùng để hỗ trợ pipelining.Đường ống so với ứng dụng một phần cho thiết kế API
Khi thiết kế một API, tôi có thể làm theo xu hướng đó, như trong ví dụ đơn giản máy trạng thái này:
type Transition =
{ CurrentState : string; TriggeringEvent : string; NewState : string }
let getNewState currentState triggeringEvent transitions =
let isMatch t =
t.CurrentState = currentState
&& t.TriggeringEvent = triggeringEvent
match transitions |> Seq.tryFind isMatch with
| Some transition -> Some(transition.NewState)
| None -> None
let myTransitions =
[ { CurrentState = "A"; TriggeringEvent = "one"; NewState = "B" };
{ CurrentState = "B"; TriggeringEvent = "two"; NewState = "A" } ]
let result = myTransitions |> getNewState "A" "one"
printfn "%A" result
Đây getNewState
có chữ ký:
(string -> string -> seq<Transition> -> string option)
mà hỗ trợ pipelining:
myTransitions |> getNewState "A" "one"
Nhưng trong một số trường hợp, chuỗi là hằng số trong khi các đối số khác thay đổi. Trong ví dụ máy trạng thái, bảng chuyển tiếp (transitions
) sẽ được cố định cho một máy trạng thái nhất định. getNewState
sẽ được gọi nhiều lần với các trạng thái và sự kiện khác nhau. Nếu chuỗi là tham số đầu tiên, người gọi có thể sử dụng ứng dụng phần:
let getNewState transitions currentState triggeringEvent =
// body same as before
let stateMachine = getNewState myTransitions
let result1 = stateMachine "A" "one"
let result2 = stateMachine "B" "two"
printfn "%A" result1
printfn "%A" result2
Bây giờ getNewState
có chữ ký:
(seq<Transition> -> string -> string -> string option)
và stateMachine
có chữ ký:
(string -> string -> string option)
Làm thế nào tôi có thể thiết kế một API để hỗ trợ cả ứng dụng pipelining và partial, tại tùy chọn của người gọi?
của bạn 'getNewState' là một chức năng let-ràng buộc, vì vậy tôi không nghĩ rằng có một giải pháp dễ dàng để những gì bạn đang tìm kiếm. (Xem http://msdn.microsoft.com/en-us/library/dd233213.aspx.) Một giải pháp có thể là định nghĩa một kiểu mới - ví dụ, một bản ghi - đối số cho 'getNewState', để bất kể những gì thay đổi, bạn có thể tạo một bản ghi mới và đặt nó vào 'getNewState'. Hoặc bạn có thể chờ Petricek hoặc Pappas cung cấp câu trả lời có thẩm quyền. – Shredderroy