了解F#文档功能签名

Luc*_*ier 5 f#

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

但文档似乎对我来说真的很神秘.把这个文档页面pown例如函数.用法很简单,但我不懂函数签名:

// Signature:
pown : ^T -> int -> ^T (requires ^T with static member One and ^T with static member op_Multiply and ^T with static member (/))
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释一下,以下是什么?

  1. T之前的^(Circumflex)是做什么的?
  2. "T"是什么意思?它是通用型吗?
  3. 双重做什么 - >做什么?
  4. 需求声明有什么作用?

我希望在一个答案中没有太多内容.

kvb*_*kvb 8

  1. 这表明这T是一个静态解析的类型参数,而不是普通的泛型类型参数(另请参见下面的4).
  2. 是.
  3. ->是函数的类型构造函数,是右关联的,所以这部分相当于^T -> (int -> ^T).换句话说,如果你传递类型的参数^T给这个函数,你会从返回的功能int^T.那么pown 2功能2 x还没有通过功率.并且pown 2 8是相同的(pown 2) 8:它是2 8.
  4. 在调用时,无论采用何种具体类型^T,必须静态地知道它以满足这些要求.所以你可以调用pown 2 8(因为int支持这些操作),但不能pown "test" 8(因为string没有).


scr*_*wtp 6

那里有一些事情,所以对于初学者来说,这就是我建议你在F#中使用签名的方法.首先,忽略那种抑扬 - 用心灵替代那里的蜱.然后你可以忽略"需要"部分 - 长话短说,它就在那里因为抑扬.

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

// Signature:
pown : 'T -> int -> 'T
Run Code Online (Sandbox Code Playgroud)

'T是一个通用型-大写'T是一个.NET标准,F#通常使用小写'a,'b等什么这个签名描述的是一个函数,它接受一个'Tint,并返回'T.最后一个->类型是函数的"返回类型" - 至少这是在开始时考虑它的有用方法.

在现实中,还有更多的说了一下-在F#功能咖喱(和部分应用默认情况下),所以你真的是需要一个函数'T,返回签名的功能int -> 'T-在这一点很清楚,为什么你有双->.

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