F# 将选项val更改为(val的SpecialType | DefaultType)

F# 将选项val更改为(val的SpecialType | DefaultType),f#,fold,F#,Fold,我得到了一些代码来管理我的连接状态。我正在努力学习F#。现在在connect函数中,我不想返回我的connected状态,它需要一个TcpClient。try_connect_tcp函数返回一个选项TcpClient。我尝试了行try\u connect\u tcp主机名端口|>选项。如果try\u connect\u tcp返回无,请折叠Connected Disconnected以返回Disconnected。但它似乎不起作用。我做错了什么 我的代码: 类型连接状态= |断开 |TCP客户端

我得到了一些代码来管理我的连接状态。我正在努力学习F#。现在在connect函数中,我不想返回我的connected状态,它需要一个TcpClient。try_connect_tcp函数返回一个选项TcpClient。我尝试了行
try\u connect\u tcp主机名端口|>选项。如果try\u connect\u tcp返回无,请折叠Connected Disconnected
以返回Disconnected。但它似乎不起作用。我做错了什么

我的代码:

类型连接状态=
|断开
|TCP客户端的连接
|TcpClient*字符串的LoggedIn
让我们尝试连接tcp主机名端口=
尝试
一些(新的TcpClient(主机名、端口))
具有
| :? ArgumentNullException->printf“空主机名”;没有一个
| :? ArgumentOutOfRangeException->printf“无效端口号”;没有一个
| :? SocketException->printf“IDK MAN”;没有一个
让连接状态主机名端口=
将连接状态与匹配
|断开连接->尝试连接\u tcp主机名端口|>选项。折叠连接断开连接//问题出在这里
|>连接状态

为什么不更改
try\u connect\u tcp
功能以直接使用
连接状态
类型

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
编辑:如果确实要使用
选项.fold
,则传递给它的函数需要两个参数。在您的情况下,使用原始的
try\u connect\u tcp
函数,您可以这样编写:

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

为什么不将
try\u connect\u 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
编辑:如果确实要使用
选项.fold
,则传递给它的函数需要两个参数。在您的情况下,使用原始的
try\u connect\u tcp
函数,您可以这样编写:

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

为什么它似乎不起作用?有什么错误?
选项。fold
似乎没有什么用处。虽然这是可能的,但会很尴尬。为什么不直接使用模式匹配呢?您似乎已经知道它是如何工作的。
选项
有两种状态,而
连接状态
有三种状态。从
选项
映射到
连接状态
的规则是什么,除了
映射到
断开连接
之外?为什么它似乎不起作用?有什么错误?
选项。fold
似乎没有什么用处。虽然这是可能的,但会很尴尬。为什么不直接使用模式匹配呢?您似乎已经知道它是如何工作的。
选项
有两种状态,而
连接状态
有三种状态。从
选项
映射到
连接状态
的规则是什么,除了
映射到
断开连接