Functional programming F带可选反求分量的判别并集
我和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的新手,我可能会用错误的方法解决这个问题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
如果您打算在一个代码文件中定义数百个这样的东西,那么使用上述方法并缩短名称转换可能是一个好主意。否则,只需使用“有”和“无”。冗长是一个可以忽略不计的考虑因素,如果你开始担心它,可怕的事情就会发生。我不太明白你想模拟什么,但这里有一些类似的东西 我的转换要么是数字的倍数,要么是数字的加法
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进行管道计算似乎是最简单、最干净的函数解决方案。谢谢,我喜欢你的结论。