collections - F# 中 list 和 [] 的区别

标签 collections types f# f#-interactive

我正在将一些 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<int>而不是 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是一回事吗?

最佳答案

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是一样的。

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

关于collections - F# 中 list 和 [] 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9677129/

相关文章:

generics - 由于 "ambiguity",F# 通用约束不起作用

c# - 什么情况下 TryDequeue 和类似的 System.Collections.Concurrent 收集方法会失败

java - Guava CacheBuilder 未按预期工作

c# - C# 中的泛型,使用变量类型作为参数

f# - 为什么不允许 F# 记录具有 AllowNullLiteralAttribute?

asynchronous - 失败后重新启动MailboxProcessor?

java - 对象引用和显示不同结果的对象

java - 如何将可变函数参数转换为 Set 或 List 等集合

c - 长长在 c99

javascript - firebase 登录后 TypeScript 返回对象