【发布时间】:2019-05-08 03:15:54
【问题描述】:
给定一串数字,我想要一个元组序列将非零字符映射到它们在字符串中的位置。示例:
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 构建一些东西,但除了单参数重载之外,我不知道如何获得任何东西。
【问题讨论】:
-
小改进
Seq.mapi (fun a b -> a,b) -
@JohnPalmer 啊,谢谢。我以为我之前的语法有错误,但我认为错误是由其他原因引起的。
-
另外,
||>与您想要的运算符相反。 -
作为一种解决方法,将
Seq.mapi替换为Seq.zip (Seq.initInfinite id) -
另一种方法是使用列表理解,例如
[for i=0 to xs.Length-1 do if xs.[i]<>'0' then yield i,xs.[i]]
标签: f#