Измените Option val на (SpecialType of val | DefaultType) - PullRequest
0 голосов
/ 20 февраля 2020

Я получил этот бит кода для управления состоянием моего соединения. Я пытаюсь выучить F #. Теперь в функции подключения я не хочу возвращать свое подключенное состояние, для которого требуется TcpClient. Хотя функция try_connect_tcp возвращает Option TcpClient. Я попробовал строку try_connect_tcp hostname port |> Option.fold Connected Disconnected, чтобы вернуть Disconnected, если try_connect_tcp возвращает None. Но это не похоже на работу. Что я делаю не так?

Мой код:

type ConnectionState = 
    | Disconnected
    | Connected of TcpClient
    | LoggedIn of TcpClient * string

let try_connect_tcp hostname port =
    try
        Some(new TcpClient(hostname, port))
    with
        | :? ArgumentNullException -> printf "Empty Hostname"; None
        | :? ArgumentOutOfRangeException -> printf "Invalid portnumber"; None
        | :? SocketException -> printf "IDK MAN"; None

let connect connectionstate hostname port = 
    match connectionstate with
    | Disconnected -> try_connect_tcp hostname port |> Option.fold Connected Disconnected //HERE'S THE PROBLEM
    | _ -> connectionstate

1 Ответ

2 голосов
/ 20 февраля 2020

Почему бы не изменить функцию try_connect_tcp для работы непосредственно с типом ConnectionState?

let try_connect_tcp hostname port =
    try
        Connected (TcpClient (hostname, port))
    with
        | :? ArgumentNullException -> printf "Empty Hostname"; Disconnected
        | :? ArgumentOutOfRangeException -> printf "Invalid portnumber"; Disconnected
        | :? SocketException -> printf "IDK MAN"; Disconnected

Редактировать: Если вы действительно хотите использовать Option.fold, функция для передачи требуется два параметра. В вашем случае, используя вашу оригинальную функцию try_connect_tcp, вы можете написать ее так:

let connect connectionstate hostname port = 
    match connectionstate with
    | Disconnected ->
        try_connect_tcp hostname port
        |> Option.fold (fun _ x -> Connected x) Disconnected
    | _ -> connectionstate
...