了解F#文档功能签名

时间:2016-08-08 21:13:11

标签: f#

我目前正在使用免费的在线资源学习F#。由于我很好奇,并试图在一些小练习中应用学到的东西,我发现自己经常查阅MSDN F#文档。

但文档对我来说似乎真的很神秘。以pown函数为例documentation page。用法非常简单,但我不理解函数签名:

// Signature:
pown : ^T -> int -> ^T (requires ^T with static member One and ^T with static member op_Multiply and ^T with static member (/))

有人可以向我解释一下以下内容是什么吗?

  1. T之前的^(Circumflex)是做什么的?
  2. “T”是什么意思?它是通用型吗?
  3. 双重的是什么 - >办?
  4. 需求声明有什么作用?
  5. 我希望在一个答案中没有太多内容。

2 个答案:

答案 0 :(得分:8)

  1. 这表示ID FEV1_Date11 FEV1_Date12 FEV1_Date13 DATE11 DATE12 DATE13 18105 1.35 1.25 1.04 6/9/1990 8/16/1991 8/27/1993 18200 0.87 0.85 9/12/1991 3/11/1993 18303 0.79 4/23/1992 24204 4.05 3.95 3.99 6/8/1992 3/22/1993 11/5/1994 28102 1.19 1.04 0.96 10/31/1990 7/24/1991 6/27/1992 34104 1.03 1.16 1.15 7/25/1992 12/8/1993 12/7/1994 43108 0.92 0.83 0.79 6/23/1993 1/12/1994 1/11/1995 103114 2.43 2.28 2.16 6/5/1994 6/21/1995 4/7/1996 114101 0.73 0.59 0.6 6/25/1989 8/5/1990 8/24/1991 statically resolved type parameter而不是普通的通用类型参数(另请参阅下面的4)。
  2. T是函数的类型构造函数,是右关联的,因此这部分等同于->。换句话说,如果您将类型^T -> (int -> ^T)的参数传递给此函数,则会从^T返回到int的函数。所以^T是功能2 x ,其中尚未通过功率。 pown 2pown 2 8相同:它是2 8
  3. 在调用时,无论用什么具体类型代替(pown 2) 8,都必须静态知道满足这些要求。因此,您可以致电^T(因为pown 2 8支持这些操作),但不是int(因为pown "test" 8没有)。

答案 1 :(得分:6)

有一些事情发生在那里,所以对于初学者来说,这就是我建议你如何处理F#中的签名。首先,忽略那种抑扬 - 用心灵替代那里的蜱。然后你可以忽略"要求"很长一段时间,由于旋风,它就在那里。

所以在那之后你会有这样的签名:

// Signature:
pown : 'T -> int -> 'T

'T是泛型类型 - 大写'T是.NET标准,F#通常使用小写'a'b等。此签名描述的是一个函数获取'Tint,并返回'T。最后一个->之后的类型是"返回类型"功能 - 至少在开始时考虑它是一种有用的方式。

实际上,还有更多内容 - 在F#函数中是curry(并且默认情况下部分适用),所以你真正拥有的是一个函数,它接受'T并返回一个函数签名int -> 'T - 此时您已清楚为什么您有双->

旋风的东西是静态解决的类型 - 我看到@kvb已经提供了更多细节。知道它存在是很好的,但它在实践中很少被使用(你会在核心数字函数和运算符上看到它)。