Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming F带可选反求分量的判别并集_Functional Programming_F#_Optional Parameters_Discriminated Union - Fatal编程技术网

Functional programming F带可选反求分量的判别并集

Functional programming F带可选反求分量的判别并集,functional-programming,f#,optional-parameters,discriminated-union,Functional Programming,F#,Optional Parameters,Discriminated Union,我和F一起工作,努力建立我的商业模式。 假设我有一个float列表和两种类型的转换,我可以应用于它。 举例来说: 类型转换= |期间名称:期间 |周期的P2MA:周期 然后我定义了一个函数let compute Transformation list来计算列表上的任何类型的转换 使用上述转换类型,我可以通过示例创建SMA3或P2SMA5 我希望能够以一种我可以通过示例编写SMA3、P2SMA5、SMA10的方式嵌套转换。但我也希望仍然能够写SMA2只。 我尝试使用选项,但我认为编写SMA3、No

我和F一起工作,努力建立我的商业模式。 假设我有一个float列表和两种类型的转换,我可以应用于它。 举例来说:

类型转换= |期间名称:期间 |周期的P2MA:周期

然后我定义了一个函数let compute Transformation list来计算列表上的任何类型的转换

使用上述转换类型,我可以通过示例创建SMA3或P2SMA5

我希望能够以一种我可以通过示例编写SMA3、P2SMA5、SMA10的方式嵌套转换。但我也希望仍然能够写SMA2只。 我尝试使用选项,但我认为编写SMA3、None或SMA3、SomeP2SMA5太冗长了

有办法吗?也许我的方法是错误的,因为我是F的新手,我可能用错误的方法解决问题

非常感谢你的帮助

我尝试使用选项,但我认为编写SMA3、None或SMA3、SomeP2SMA5太冗长了

您可以将静态成员与可选参数一起使用:

类型转换= | [] SMA周期的内部:int*内部:转换选项 ... 静态成员周期:int,?t:转换= 短周期 然后可以编写:Transformation.SMA3或Transformation.SMA3,Transformation.P2SMA5。这需要更多的字符,但构造更少。你可能认为它更简洁,也可能不认为它更简洁

我是F的新手,我可能会用错误的方法解决这个问题

如果您打算在一个代码文件中定义数百个这样的东西,那么使用上述方法并缩短名称转换可能是一个好主意。否则,只需使用“有”和“无”。长篇大论是一个微不足道的考虑,如果你开始担心它,可怕的事情开始发生

我尝试使用选项,但我认为编写SMA3、None或SMA3、SomeP2SMA5太冗长了

您可以将静态成员与可选参数一起使用:

类型转换= | [] SMA周期的内部:int*内部:转换选项 ... 静态成员周期:int,?t:转换= 短周期 然后可以编写:Transformation.SMA3或Transformation.SMA3,Transformation.P2SMA5。这需要更多的字符,但构造更少。你可能认为它更简洁,也可能不认为它更简洁

我是F的新手,我可能会用错误的方法解决这个问题


如果您打算在一个代码文件中定义数百个这样的东西,那么使用上述方法并缩短名称转换可能是一个好主意。否则,只需使用“有”和“无”。冗长是一个可以忽略不计的考虑因素,如果你开始担心它,可怕的事情就会发生。

我不太明白你想模拟什么,但这里有一些类似的东西

我的转换要么是数字的倍数,要么是数字的加法

type Trans = 
    | Mult of period: int
    | Add of period: int
现在我可以写一个解释函数,给定一个数字和一个转换,我可以解释它

let interpret x trans = 
    match trans with
    | Mult p -> p * x
    | Add p -> p + x
所以我们现在可以做一些简单的事情 设x=1乘2

但是你想连锁转换吗? 所以让我们允许

let interprets xs x = 
    List.fold (fun state trans -> 
        interpret state trans) x xs
我们可以去

let foo = [ Mult 3; Add 2 ]

let bar = interprets foo 1
好的,如果你真的想统一处理这些变换列表的组合,这可能有点像函数组合

然后我会很想去注意,我正试图遵循你的编码风格 这里有很多东西需要学习,所以也许你可以坚持上面的方法,直到你很高兴你能更好地理解F

type Trans = 
    | Mult of period: int
    | Add of period: int
    | Compose of chain: List<Trans>
 
let rec interpret x trans = 
    let interprets xs x = 
        List.fold (fun state trans -> 
            interpret state trans) x xs
    match trans with
    | Mult p -> p * x
    | Add p -> p + x
    | Compose ps -> 
        interprets ps x
        
let two = interpret 1 (Mult 2)

let three = interpret 1 (Compose [ Mult 2; Add 1 ])
不过,建议是让数据模型以最简单的方式对数据建模,然后使用函数使您的代码变得优雅,并映射到该模型中,这两种情况通常看起来非常不同


警告:我还没有测试这些代码中的一些,我不太明白你想建模什么,但这里有一些类似的东西

我的转换要么是数字的倍数,要么是数字的加法

type Trans = 
    | Mult of period: int
    | Add of period: int
现在我可以写一个解释函数,给定一个数字和一个转换,我可以解释它

let interpret x trans = 
    match trans with
    | Mult p -> p * x
    | Add p -> p + x
所以我们现在可以做一些简单的事情 设x=1乘2

但是你想连锁转换吗? 所以让我们允许

let interprets xs x = 
    List.fold (fun state trans -> 
        interpret state trans) x xs
我们可以去

let foo = [ Mult 3; Add 2 ]

let bar = interprets foo 1
好的,如果你真的想统一处理这些变换列表的组合,这可能有点像函数组合

然后我会很想去注意,我正试图遵循你的编码风格 这里有很多东西需要学习,所以也许你可以坚持上面的方法,直到你很高兴你能更好地理解F

type Trans = 
    | Mult of period: int
    | Add of period: int
    | Compose of chain: List<Trans>
 
let rec interpret x trans = 
    let interprets xs x = 
        List.fold (fun state trans -> 
            interpret state trans) x xs
    match trans with
    | Mult p -> p * x
    | Add p -> p + x
    | Compose ps -> 
        interprets ps x
        
let two = interpret 1 (Mult 2)

let three = interpret 1 (Compose [ Mult 2; Add 1 ])
不过,建议是让数据模型以最简单的方式对数据建模,然后使用函数使您的代码变得优雅,并映射到该模型中,这两种情况通常看起来非常不同

警告:我还没有测试过一些代码

你不可能按照你想要的方式,让受歧视的工会案件超载。但如果你愿意接受一个很小的dif 根据不同的语法,您可以这样做:

类型周期=int 类型转换= |时期的Sma |周期*变换的Sma 和p2sma变换= |周期的P2sma |周期*变换的P2sma' 改造= |SMA变换的OfSma |P2SMA变换的OfP2Sma 让我们看看这个时期= SMA周期|>OfSma 让我们来改变= Sma’周期,变换|>OfSma 让我们看看这个时期= P2Sma周期|>p2Sma 让我们看一看周期,变换= P2sma’周期,变换|>P2sma 让变换= [| SMA3 P2SMA5 SMA'3,P2SMA'5,SMA10 |] 对于变换中的变换,请执行以下操作: printfn%A转换 与所需语法的唯一区别是表示嵌套转换的撇号

你不可能按照你想要的方式,让受歧视的工会案件超载。但如果您接受稍微不同的语法,您可以这样做:

类型周期=int 类型转换= |时期的Sma |周期*变换的Sma 和p2sma变换= |周期的P2sma |周期*变换的P2sma' 改造= |SMA变换的OfSma |P2SMA变换的OfP2Sma 让我们看看这个时期= SMA周期|>OfSma 让我们来改变= Sma’周期,变换|>OfSma 让我们看看这个时期= P2Sma周期|>p2Sma 让我们看一看周期,变换= P2sma’周期,变换|>P2sma 让变换= [| SMA3 P2SMA5 SMA'3,P2SMA'5,SMA10 |] 对于变换中的变换,请执行以下操作: printfn%A转换
与所需语法的唯一区别是表示嵌套转换的撇号。

我不太理解您试图建模的内容,我知道您有两种转换类型,它们将浮点列表映射到。。。浮点数列表?我不明白为什么你需要嵌套它们,而不仅仅是按顺序应用转换列表?我真的不需要嵌套它们。我正在将我用C编写的代码转换为F。在我的C代码中,由于构造函数重载,我能够嵌套它们,我只是觉得通过示例编写一个嵌套转换(如SMA3、P2SMA5)非常优雅。问题是,是否有一种方法,并且在F中也适合这样做。事实上,感谢你的评论和其他答案,我意识到这不是一种方法。简单地将它们链接成一个数组[SMA3,P2SMA5],然后对每个transfo进行管道计算似乎是最简单、最干净的函数解决方案。谢谢,我喜欢你的结论。我真的不明白你想建模什么,我知道你有两种转换类型,它们将浮点列表映射到。。。浮点数列表?我不明白为什么你需要嵌套它们,而不仅仅是按顺序应用转换列表?我真的不需要嵌套它们。我正在将我用C编写的代码转换为F。在我的C代码中,由于构造函数重载,我能够嵌套它们,我只是觉得通过示例编写一个嵌套转换(如SMA3、P2SMA5)非常优雅。问题是,是否有一种方法,并且在F中也适合这样做。事实上,感谢你的评论和其他答案,我意识到这不是一种方法。简单地将它们链接成一个数组[SMA3,P2SMA5],然后对每个transfo进行管道计算似乎是最简单、最干净的函数解决方案。谢谢,我喜欢你的结论。