【问题标题】:What does # (hash symbol / pound sign) mean in type signatures?#(井号)在类型签名中是什么意思?
【发布时间】:2014-05-30 01:33:56
【问题描述】:

seq<seq<'a>> 相比,# 在类型签名(如seq<#seq<'a>>)中的含义是什么?

【问题讨论】:

标签: casting f# symbols type-signature


【解决方案1】:

这称为弹性类型。简短的总结是#type 表示从type 继承的任何 类型。因此,在您的具体示例中,seq<#seq<'a>> 将是包含 'a 值的任何集合的序列。

在调用函数时,F# 会自动将具体类型转换为接口 - 例如,您可以调用以数组 'a[] 为参数的函数,该函数以 seq<'a> 为参数。但是,当您有数组时,这不起作用 - 因为 'a[][] 仅实现 seq<'a[]> 而不是 seq<seq<'a>>

例如,以下两个函数返回嵌套序列的长度列表:

let f1 (s:seq<seq<'T>>) = [ for i in s -> Seq.length i ]
let f2 (s:seq<#seq<'T>>) = [ for i in s -> Seq.length i ]

但在列表列表中只能调用第二个:

[ [1]; [2;3] ] |> f1
// error FS0001: The type 'int list list' is not 
// compatible with the type 'seq<seq<'a>>'

[ [1]; [2;3] ] |> f2
// val it : int list = [1; 2]

【讨论】:

    猜你喜欢
    • 2016-01-03
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多