F#distinctBy行为

时间:2013-03-25 02:45:31

标签: f# identity

我不明白此片段中distinctBy的行为:

let s  = [123; 231; 321]
let s1 = s |> Seq.map        (string >> Seq.sort)
let s2 = s |> Seq.distinctBy (string >> Seq.sort)

产生:

s1 = seq [seq ['1'; '2'; '3']; seq ['1'; '2'; '3']; seq ['1'; '2'; '3']]

正如所料,但是:

s2 = seq [123; 231; 321]

我只期望一个元素,因为3个键是相同的。哪一部分我错了?

2 个答案:

答案 0 :(得分:4)

F#不比较Sequences的相等性,请参阅此示例

(123 |> string |> Seq.sort) = (123 |> string |> Seq.sort)
val it : bool = false

我想这是为了支持无限序列。

您可以通过映射到列表

来解决此问题
let s  = [123; 231; 321] |> Seq.distinctBy (string >> Seq.sort >> Seq.toList);;
val s : seq<int>

> s;;
val it : seq<int> = seq [123]

答案 1 :(得分:2)

Seq.sort可能没有实现比较逻辑。因此,底层实现会看到三个不同的对象。

如果您执行以下操作,则类似:

object.ReferenceEquals("1", 1.ToString());