给定一串数字,我希望有一系列元组映射非零字符及其在字符串中的位置。例如:
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构建一些东西,但我无法弄清楚如何获得除单参数重载之外的任何东西。
答案 0 :(得分:8)
但在我看来,如果库提供了snd函数,它还应该提供makeTuple函数。
F#假定您使用fst
,snd
分解元组比组合它们更频繁。功能库设计通常遵循 minimal 原则。只提供常见用例的功能,其他功能应易于定义。
我找不到;我错过了什么吗?
不,你不是。这与FSharpPlus定义tuple2
,tuple3
等的原因相同。以下是直接来自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
也许您会发现此运营商也很有用