我正在尝试探索F#互动环境中类似于::
的运算符类型。
但是我得到了这些类型的错误信息:
Unexpected symbol '::' in expression. Expected ')' or other token.
即使我用
(::)
来包围它也一样。我正在尝试探索F#互动环境中类似于::
的运算符类型。
但是我得到了这些类型的错误信息:
Unexpected symbol '::' in expression. Expected ')' or other token.
(::)
来包围它也一样。> let inline showmecons a b = a :: b;;
val inline showmecons : 'a -> 'a list -> 'a list
或者
> let inline showmepow a b = a ** b;;
val inline showmepow :
^a -> ^b -> ^a when ^a : (static member Pow : ^a * ^b -> ^a)
如果您将通常的操作符括在括号中,您将看到它们的类型:
> (+);;
val it : (int -> int -> int) = <fun:it@4-5>
不幸的是,这限制了操作符的类型只能是一个特定的类型-F#交互式不打印带约束的多态定义。您可以使用Stephen建议的解决方法(并定义一个新的inline
函数)来查看。
它不能用于::
的原因是因为::
实际上是一种特殊的语法结构(直接在F#规范中定义)。
这篇文章有些老了,但我正在学习F#并且也想搞清楚这个问题。
查看F#规范第32页,我们可以看到符号关键字在F#中也有编译名称。对于::
的等效编译名称是op_ColonColon
,它实际上接受元组:
> op_ColonColon;;
val it : arg0:'a * arg1:'a list -> 'a list = <fun:clo@22-5>`
使用::
来定义内联函数会给我们一个柯里化的cons函数,这是令人误解的,我认为。