Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 任何.NET类型/接口都可以作为列表进行模式匹配吗?_F# - Fatal编程技术网

F# 任何.NET类型/接口都可以作为列表进行模式匹配吗?

F# 任何.NET类型/接口都可以作为列表进行模式匹配吗?,f#,F#,我尝试了模式匹配.NET列表类型,例如IList和list: 我得到一个错误,说表达式应该有IList类型,但这里有'a list'类型。我明白为什么它不起作用了——显然,这些类型不兼容,我想F列表类型没有实现IList 我想知道的是,是否有任何BCL列表类型可以进行模式匹配,而无需在匹配表达式中插入Seq.toList?从BCL中,我相信数组是唯一可以在不需要Seq.toList的情况下进行匹配的集合类型 看 从bcl来看,我认为数组是唯一可以在不需要Seq.toList的情况下进行匹配的集合

我尝试了模式匹配.NET列表类型,例如IList和list:

我得到一个错误,说表达式应该有IList类型,但这里有'a list'类型。我明白为什么它不起作用了——显然,这些类型不兼容,我想F列表类型没有实现IList


我想知道的是,是否有任何BCL列表类型可以进行模式匹配,而无需在匹配表达式中插入Seq.toList?

从BCL中,我相信数组是唯一可以在不需要Seq.toList的情况下进行匹配的集合类型


从bcl来看,我认为数组是唯一可以在不需要Seq.toList的情况下进行匹配的集合类型


F不像C那样执行自动类型强制。例如,这意味着您不能比较不同类型的两个值,即使其中一个是另一个的子类型

let x : string = "abc"
let y : obj = box "abc"
let eq = x = y  // Type mismatch error here
将此应用于特定情况,您无法匹配列表上的非列表值,即使该值以某种方式是列表的子类型


然而,如果你真的对这种匹配感兴趣,你可以为自己编写一个定制的匹配器,也称为seqF,它不会像C那样进行自动类型强制。例如,这意味着您不能比较不同类型的两个值,即使其中一个是另一个的子类型

let x : string = "abc"
let y : obj = box "abc"
let eq = x = y  // Type mismatch error here
将此应用于特定情况,您无法匹配列表上的非列表值,即使该值以某种方式是列表的子类型


但是,如果你真的对这种匹配感兴趣,你可以为自己编写一个自定义匹配器,也称为,它将采用seqNo,用于构造和解构F列表的语法是专门为该类型定义的,而那个类型只有那个些操作符实际上被用作列表的大小写标签,这些列表得到了编译器的特殊处理。这是在核心库中定义列表类型的方式:

type List<'T> = 
   | ([])  :                  'T list
   | (::)  : Head: 'T * Tail: 'T list -> 'T list
F list与System.Collections.Generic.list有着本质上的不同——它是一个,这种性质反映在构造/解构的语法中

另一方面,System.Collections.Generic.List是一个可以扩大规模的集合,但它有一个数组作为后盾,并具有数组的性能特征——事实上,它的F名称ResizeArray是一个更合适的集合

IList是可变列表的接口,而F list是不可变的——实现IList没有意义


对于这两种类型-以F列表的相同方式将它们分解为头和尾,根本不能反映它们的真实情况,这将是一种不自然的操作,就像索引到F列表是一种不自然的操作一样,用于构造和解构F列表的语法是专门为该类型定义的,而该类型实际上只使用那些运算符作为列表的大小写标签,这些运算符得到编译器的特殊处理。这是在核心库中定义列表类型的方式:

type List<'T> = 
   | ([])  :                  'T list
   | (::)  : Head: 'T * Tail: 'T list -> 'T list
F list与System.Collections.Generic.list有着本质上的不同——它是一个,这种性质反映在构造/解构的语法中

另一方面,System.Collections.Generic.List是一个可以扩大规模的集合,但它有一个数组作为后盾,并具有数组的性能特征——事实上,它的F名称ResizeArray是一个更合适的集合

IList是可变列表的接口,而F list是不可变的——实现IList没有意义

对于这两种类型,将它们分解为头和尾,就像对F列表所做的那样,根本不能反映它们是什么,这将是一种不自然的操作,就像对F列表进行索引是一种不自然的操作一样

match "abcd" with
| IsList [] -> "Empty string"
| IsList ('a'::_) -> "Starts with an a"
| IsList _ -> "Something else"
match [1,2,3] with
| IsList [1,2,3] -> "One, two, three"
| IsList [] -> "Empty list"
| IsList _ -> "Huh?"
type List<'T> = 
   | ([])  :                  'T list
   | (::)  : Head: 'T * Tail: 'T list -> 'T list