繁体   English   中英

f#中用户定义类型的混淆

Confusion on user defined types in f#

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

对于诸如int和string之类的内置类型,在函数中对其进行注释的方式如下:

let testFunction (x:int) = x * x

但是对于用户定义的类型,使用它们的方式是不同的。 如下图所示:

type NewType = NewType of int

let test (NewType a)= a * 2

但是,如果我用以下方式表示,解释器会给我显示不匹配的类型错误(int vs NewType):

let test (a:NewType) = a * 2

这是为什么 ?

2 个回复

这是一个类型注释:

let testFunction (x:int) = x * x

但在行中:

let test (NewType a)= a * 2

这不是类型注释 这就是通过模式匹配进行分解 模式匹配也可以应用于示例中的函数参数。 它的作用是解开NewType包含的int值并将其绑定到a值。 这就是为什么您可以进行乘法,因为它是在int值而不是在NewType

最后一行也是类型注释:

let test (a:NewType) = a * 2

这是行不通的,因为乘法默认情况下推断int和注解表明, a类是NewType ,这就是为什么你收到此错误信息。 您必须像进行let test (a:NewType) = a * 2一样解开包装

您将模式匹配与类型注释混淆了。 第二个示例使用适当的类型注释:

let test (a:NewType) = a * 2

不幸的是,这意味着您不能在没有模式匹配来提取它的情况下访问类型构造函数的int参数,如下所示:

let test (a:NewType) =
    match a with
    | NewType x -> x * 2

对您有用的第一种情况不是使用类型注释,而是将模式匹配作为参数的一部分,因此已经为您尝试访问的值指定了名称,并且不需要进一步的模式匹配。 如果您的类型可能有多个这样的模式,

type NewType = NewType of int
             | OtherType of float

并且您尝试使用模式而不是类型注释的第一种方式编写代码,您将看到一条警告,指出您的模式匹配不完整:

> let testcode (NewType a) = a * 2;;                  

  let testcode (NewType a) = a * 2;;
  --------------^^^^^^^^^

warning FS0025: Incomplete pattern matches on this expression. For example, 
the value 'OtherType (_)' may indicate a case not covered by the pattern(s).
1 类型定义内的F#递归

我在尝试在F#中实现自动区分时遇到一些问题。 我认为问题出在评估不“懒惰”。 这是我的代码: 如果我尝试使用“添加测试”,则会得到一个堆栈溢出错误,我认为这取决于类型本身中依靠(+)的(+)定义。 有什么办法可以解决这个问题? 任何帮助将不胜感激。 非常感谢Ash ...

2 F#:带类型定义的报价?

我正在玩引号,我看不到类型定义的表达模式。 真的没有,或者我错过了什么? 在引号文字中给出“意外的关键字'类型'。” ...

3 F#类型定义语法

我正在研究F#的'99问题',并看到了NestedList的以下定义: 我被这里的语法有点困惑,因为通常只有在后一类型名称type 。 有人可以澄清一下吗? 谢谢! ...

2014-10-25 22:45:57 3 432   f#
4 F#中的类型定义和类型推断

我有两个示例类型,按此顺序定义: 我正在尝试编写一个可以接受两种类型的函数: 当我尝试将Map<decimal option, Quote list>传递给函数时,出现错误: 我原本以为我能够将两种类型的映射传递给函数,但编译器似乎推断只有Map<dec ...

2016-09-13 15:49:25 2 118   f#
6 在F#上定义特定类型的新数组

如何具体定义特定类型T的新数组? 奇怪的是,我找不到任何有用的信息。 我想写这样的东西: 只是arr的元素必须是T类型。 如何在F#上执行此操作? ...

2012-06-15 11:02:47 4 2153   arrays/ f#
7 抽象类型定义f#

我正在尝试在接口或抽象类中定义几种类型,而实现的方式尚未指定。 然后,我想从另一个接口继承,以便我可以在interface2中使用在第一个接口中定义的类型指定我的方法。 例如: 这个想法是我希望模块然后实现interface2,因此它应该实现MyType1和MyType2,以及m ...

8 F#认为我的类型未定义

我开始玩F#,所以我想我将从使用它进行单元测试开始。 问题是Visual Studio不断告诉我该类型未为我正在使用的某些类型定义,我不明白为什么。 我已经导入了名称空间,并且正在使用的类型是公共的。 这是F#代码: 还有一些C#代码: Filter类型显然是未定义的( ...

2016-01-12 02:31:47 1 894   c#/ f#
10 带表达式的F#类型定义

有可能表达这样的事情: 我知道它不可能静态地执行,因为这意味着F#具有依赖类型。 在C#中,我习惯于使用代码契约来执行此类操作并获得运行时实施。 我正在寻找类似的东西。 谢谢 编辑:感谢所有有各种利弊的答案。 在那里,我只使用F#的一小部分,这是ocaml核心的一个子集 ...

2012-12-30 10:14:20 4 800   f#
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM