我有一个问题,想要将一个函数变成通用的,以便可以重复使用。我遇到了这样一种情况:无论数据是
理想情况下,我可以像在
但是由于它包含在另一个函数定义中,编译器会说:“显式类型参数只能用于模块或成员绑定”。 我在这里打一场无用之战吗?我应该只满足简单版本吗?我的直觉告诉我,我在这里错过了一些微妙和简单的东西。如果可能,我宁愿重用行为而不是两次编写完全相同的内容。 我应该采取不同的方法吗?欢迎任何反馈!
float
还是string
,我都希望执行相同的一组操作。我在下面包含了一些数据模型,以便您可以看到我正在做什么。在DataSeries
模块中,我有两个不同的函数:simpleHigh
和preferredHigh
。其中simpleHigh
函数正好符合我的要求。您可以看到,在两种情况下,即float
或string
,我都使用了相同的一组函数。理想情况下,我可以像在
preferredHigh
函数中所尝试的那样做。我定义了一个单一的函数,然后将其用于两种条件。但编译器却抱怨说存在类型不匹配。我尝试让内部的high
函数接受一个类型参数:let high<'T> v = (Seq.sortBy (fun x -> x.Value) >> Seq.last >> (fun x -> x.Value))
但是由于它包含在另一个函数定义中,编译器会说:“显式类型参数只能用于模块或成员绑定”。 我在这里打一场无用之战吗?我应该只满足简单版本吗?我的直觉告诉我,我在这里错过了一些微妙和简单的东西。如果可能,我宁愿重用行为而不是两次编写完全相同的内容。 我应该采取不同的方法吗?欢迎任何反馈!
open System
type Observation<'T> = {
ObsDateTime : DateTimeOffset
Value : 'T
}
type Result =
| Float of float
| String of string
type DataSeries =
| Float of Observation<float> seq
| String of Observation<string> seq
module DataSeries =
let summarise
(f: float Observation seq -> float)
(s: string Observation seq -> string)
(ds: DataSeries) =
match ds with
| DataSeries.Float v -> f v |> Result.Float
| DataSeries.String v -> s v |> Result.String
// What works
let simpleHigh ds =
summarise
(Seq.sortBy (fun x -> x.Value) >> Seq.last >> (fun x -> x.Value))
(Seq.sortBy (fun x -> x.Value) >> Seq.last >> (fun x -> x.Value))
ds
// What I would rather write
let preferredHigh ds =
let high v = (Seq.sortBy (fun x -> x.Value) >> Seq.last >> (fun x -> x.Value))
summarise
high
high
ds
high
不是一个函数。好吧,我感到有些傻 :) 谢谢! - Matthew Crews