【问题标题】:Is there a library function or operator to create a tuple?是否有库函数或运算符来创建元组?
【发布时间】: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 -&gt; fun c -&gt; (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 -&gt; a,b)
  • @JohnPalmer 啊,谢谢。我以为我之前的语法有错误,但我认为错误是由其他原因引起的。
  • 另外,||&gt; 与您想要的运算符相反。
  • 作为一种解决方法,将Seq.mapi 替换为Seq.zip (Seq.initInfinite id)
  • 另一种方法是使用列表理解,例如[for i=0 to xs.Length-1 do if xs.[i]&lt;&gt;'0' then yield i,xs.[i]]

标签: f#


【解决方案1】:

但在我看来,如果库提供了 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&lt;'T1, 'T2&gt; 的属性以对元组强制执行模式匹配习语。详情请见Extension methods for F# tuples

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

【讨论】:

    【解决方案2】:

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

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

    而且写let x = a -&amp;- b看起来很方便

    也许你会发现这个运算符也很有用

    【讨论】:

    • 在这种简单的情况下,我更喜欢使用let x = a, b。请注意,在这种情况下,括号不是必需的。
    猜你喜欢
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2018-09-25
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    相关资源
    最近更新 更多