我目前正在使用免费的在线资源学习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 (/))
有人可以向我解释一下以下内容是什么吗?
我希望在一个答案中没有太多内容。
答案 0 :(得分:8)
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)。T
是函数的类型构造函数,是右关联的,因此这部分等同于->
。换句话说,如果您将类型^T -> (int -> ^T)
的参数传递给此函数,则会从^T
返回到int
的函数。所以^T
是功能2 x ,其中尚未通过功率。 pown 2
与pown 2 8
相同:它是2 8 。(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
等。此签名描述的是一个函数获取'T
和int
,并返回'T
。最后一个->
之后的类型是"返回类型"功能 - 至少在开始时考虑它是一种有用的方式。
实际上,还有更多内容 - 在F#函数中是curry(并且默认情况下部分适用),所以你真正拥有的是一个函数,它接受'T
并返回一个函数签名int -> 'T
- 此时您已清楚为什么您有双->
。
旋风的东西是静态解决的类型 - 我看到@kvb已经提供了更多细节。知道它存在是很好的,但它在实践中很少被使用(你会在核心数字函数和运算符上看到它)。