F# 是否有库函数或运算符来创建元组?

F# 是否有库函数或运算符来创建元组?,f#,F#,给定一个数字字符串,我希望有一个元组序列映射非零字符及其在字符串中的位置。例如: IN: "000140201" OUT: { (3, '1'); (4, '4'); (6, '2'); (8, '1') } 解决方案: let tuples = source |> Seq.mapi (fun i -> fun c -> (i, c)) |> Seq.filter (snd >> (<>) '0

给定一个数字字符串,我希望有一个元组序列映射非零字符及其在字符串中的位置。例如:

IN: "000140201"
OUT: { (3, '1'); (4, '4'); (6, '2'); (8, '1') }
解决方案:

let tuples = source
             |> Seq.mapi (fun i -> fun c -> (i, c))
             |> Seq.filter (snd >> (<>) '0')
但在我看来,如果库提供了
snd
函数,那么它还应该提供
makeTuple
函数(可能名称较短),或者至少它应该相对容易编写。我找不到它;我错过什么了吗?我试图用框架的Tuple.Create构建一些东西,但除了单参数重载之外,我不知道如何获取其他东西

但在我看来,如果库提供snd函数,那么它也应该提供makeTuple函数

F#假设您分解元组(使用
fst
snd
)的频率比组合元组的频率要高得多。函数库设计通常遵循最小原则。只需为常见用例提供函数,其他函数应易于定义

我找不到它;我错过什么了吗

不,你不是。这与定义
tuple2
tuple3
等的原因相同。以下是直接从以下几个方面定义的实用函数:

我试图用框架的Tuple.Create构建一些东西,但除了单参数重载之外,我不知道如何获取其他东西

F#编译器隐藏
System.Tuple
的属性,以在元组上强制使用模式匹配习惯用法。有关更多详细信息,请参阅


也就是说,在F#中并不总是推荐无点样式。如果你喜欢point free,你必须自己做一些繁重的工作。

这个@pad的答案很好,再加上我的2美分:我使用的是类似的操作符

let inline (-&-) a b = (a, b)
编写
let x=a-&b


也许你会发现这个操作符也很有用

小的改进
Seq.mapi(乐趣a b->a,b)
@JohnPalmer啊,谢谢。我之前以为我的语法有错误,但我想错误是由其他原因造成的。另外,
| |>
与您想要的运算符相反。作为一种解决方法,将
Seq.mapi
替换为
Seq.zip(Seq.initInfinite id)
另一种方法是使用列表理解,例如
[对于i=0到xs.Length-1,如果xs.[i]'0'则产生i,xs.[i]]
/// Creates a pair
let inline tuple2 a b = a,b
/// Creates a 3-tuple
let inline tuple3 a b c = a,b,c
/// Creates a 4-tuple
let inline tuple4 a b c d = a,b,c,d
/// Creates a 5-tuple
let inline tuple5 a b c d e = a,b,c,d,e
/// Creates a 6-tuple
let inline tuple6 a b c d e f = a,b,c,d,e,f
let inline (-&-) a b = (a, b)