我如何看待F#interactive中运算符的类型?
我试图探索F#interactive中的操作符类型,例如我如何看待F#interactive中运算符的类型?,f#,F#,我试图探索F#interactive中的操作符类型,例如: 但我得到了这样的信息: Unexpected symbol '::' in expression. Expected ')' or other token. 即使我用(::)环绕它,我还是这样做: > let inline showmecons a b = a :: b;; val inline showmecons : 'a -> 'a list -> 'a list 或 如果用括号括起来,您将看到常用运算符的
:
但我得到了这样的信息:
Unexpected symbol '::' in expression. Expected ')' or other token.
即使我用(::)
环绕它,我还是这样做:
> let inline showmecons a b = a :: b;;
val inline showmecons : 'a -> 'a list -> 'a list
或
如果用括号括起来,您将看到常用运算符的类型:
> (+);;
val it : (int -> int -> int) = <fun:it@4-5>
(+);;
val it:(int->int->int)=
不幸的是,这将操作符的类型限制为一个特定的类型-F#Interactive不打印多态定义(带有约束)。您可以使用Stephen建议的解决方法(并定义一个新的inline
函数)来了解这一点
它对
::
不起作用的原因是:
实际上是一种特殊的语法结构(直接在F#规范中定义)。这是非常古老的,但我正在学习F#,并且也想弄清楚这一点
查看第32页的,我们看到符号关键字在F#中也有一个编译名称。:
的等效编译名是op\u ColonColon
,它实际上接受元组:
> op_ColonColon;;
val it : arg0:'a * arg1:'a list -> 'a list = <fun:clo@22-5>`
>op_ColonColon;;
val it:arg0:'a*arg1:'a list->'a list=`
使用::
定义一个内联函数会给我们一个通用的cons函数,我认为这是误导
> op_ColonColon;;
val it : arg0:'a * arg1:'a list -> 'a list = <fun:clo@22-5>`