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

时间:2013-02-09 06:21:20

标签: 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')

对于这样一个简单且可能是常见的操作,似乎(fun i -> fun c -> (i, c))打字的次数要多得多。声明必要的功能很容易:

let makeTuple a b = (a, b)
let tuples2 = source
              |> Seq.mapi makeTuple
              |> Seq.filter (snd >> (<>) '0')

但在我看来,如果库提供snd函数,它还应该提供makeTuple函数(可能还有一个较短的名称),或者至少它应该相对容易撰写。我找不到;我错过了什么吗?我尝试使用框架的Tuple.Create构建一些东西,但我无法弄清楚如何获得除单参数重载之外的任何东西。

2 个答案:

答案 0 :(得分:8)

  

但在我看来,如果库提供了snd函数,它还应该提供makeTuple函数。

F#假定您使用fstsnd分解元组比组合它们更频繁。功能库设计通常遵循 minimal 原则。只提供常见用例的功能,其他功能应易于定义。

  

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

不,你不是。这与FSharpPlus定义tuple2tuple3等的原因相同。以下是直接来自Operators的效用函数:

/// 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
  

我尝试使用框架的Tuple.Create构建一些东西,但我无法弄清楚如何获得除单参数重载之外的任何东西。

F#编译器隐藏System.Tuple<'T1, 'T2>的属性以强制元组上的模式匹配习惯用法。有关详细信息,请参阅Extension methods for F# tuples

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

答案 1 :(得分:4)

@ pad的答案很棒,只是为了加上我的2美分:我正在使用类似的算子

let inline (-&-) a b = (a, b)

编写let x = a -&- b

看起来非常方便

也许您会发现此运营商也很有用