【问题标题】:Difference between list and [] in F#F#中list和[]的区别
【发布时间】:2012-03-13 01:23:27
【问题描述】:

我正在将一些 Haskell 代码移植到 F#,但对可用的集合及其在 F# 中的签名有点困惑。我的理解是列表中的元素包含在 [] 之间,{} 之间的序列和 [| 之间的数组|]。在 F# Interactive 中,当我使用 5 个整数创建每个容器时,我得到以下信息。

// List
> [1..5]
val it : int list = [1; 2; 3; 4; 5]

// Seq
> {1..5}
val it : seq<int> = seq [1; 2; 3; 4; ...]

// Array
> [|1..5|]
val it : int [] = [|1; 2; 3; 4; 5|]

令我困惑的是数组的类型签名是int []。可能是int arrayint [||] 类型会不会那么混乱?查看类型签名,我倾向于认为它是一个列表,尤其是因为一个空列表也表示为 []。

这里有一个问题:为什么序列类型是seq&lt;int&gt; 而不是int seq。我假设这可能是语法糖,但背后可能还有其他东西。

现在使用集合创建新类型:

type T1 = T1 of int list
type T2 = T2 of int seq // becomes type T2 = T2 of seq<int>
type T3 = T3 of int array
type T4 = T4 of int []

T3 和 T4 是一回事吗?

【问题讨论】:

    标签: collections types f# f#-interactive


    【解决方案1】:

    F# 允许您使用 .Net 样式类型定义和 ocaml 样式类型定义。这些都是一样的。

    int list
    list<int>  
    
    int seq
    seq<int>
    
    int array
    array<int>
    

    一些Expressions in F#

    [||] is an array
    [] is a list
    {} is a sequence
    

    在类型定义中,您也可以使用int []。这就像 C 语法糖。是的,T3 和 T4 是一样的。

    但是你不能这样做[]&lt;int&gt;[] 有点奇怪,因为它在类型定义中表现为类型数组,在表达式中表现为 op_Nil。

    【讨论】:

    • 一些琐事:F# 中的 int[][,] 类型与 C# 中的 int[,][] 类型相同,尽管交换了维度。这是为了与 F# 中的其他后缀类型名称保持一致,例如 int list list。
    • 您可能还会觉得这很有趣。 atalasoft.com/cs/blogs/rickm/archive/2009/01/29/…
    猜你喜欢
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多