首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fsharp中的fst和3元组

fsharp中的fst和3元组
EN

Stack Overflow用户
提问于 2012-03-01 15:02:15
回答 2查看 2.3K关注 0票数 5

你知道最有效的方法吗?

代码语言:javascript
复制
let toTableau2D (seqinit:seq<'a*'b*'c>) =
   let myfst = fun (a,b,c) -> a
   let myscd = fun (a,b,c) -> b
   let mytrd = fun (a,b,c) -> c

   let inputd = seqinit |> groupBy2 myfst myscd

肯定有比重写fst更好的方法。

更新后,我重新编写了以前的'a*'b为一个单一的结构,我的代码现在看起来像

代码语言:javascript
复制
let toTableau (seqinit:seq<'a*'b>) =
  let inputd = seqinit |> Seq.groupBy fst |> toMap
  let keys =  seqinit |> Seq.map fst |> Set.ofSeq |> List.ofSeq
  ...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-01 15:14:08

你为什么不直接写出来:

代码语言:javascript
复制
let toTableau2D (a, b, c) =
   let toto = a
   // ...

如果以后要引用seqinit,则始终可以重构三元组或使用命名模式:

代码语言:javascript
复制
let toTableau2D ((a, b, c) as seqinit) =
   let toto = a
   // Do something with seqinit
   // ...

编辑:

除非使用反射,否则任何类型的元组都不能使用fst函数。在您的示例中,编写一些实用程序函数并重用它们并不会有什么影响:

代码语言:javascript
复制
let fst3 (a, _, _) = a
let snd3 (_, b, _) = b
let thd3 (_, _, c) = c

let toTableau2D (seqinit: seq<'a*'b*'c>) =
   let inputd = seqinit |> groupBy2 fst3 snd3
   // ...

如果要使此操作适用于任意数量的元组元素,请考虑将元组更改为列表,并在列表上使用模式匹配。

票数 7
EN

Stack Overflow用户

发布于 2012-03-01 15:20:11

+1到@pad说的话。否则(如果你只是简化了你想要做的事情,并且被这样定义的seqinit所困),我想你总是可以这样做的:

代码语言:javascript
复制
let toTableau2D (seqinit:'a*'b*'c) =
   let toto, _, _ = seqinit          
   //...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9518503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档