如何在F#交互环境中查看运算符的类型?

4

我正在尝试探索F#互动环境中类似于::的运算符类型。

但是我得到了这些类型的错误信息:

Unexpected symbol '::' in expression. Expected ')' or other token.

即使我用(::)来包围它也一样。
3个回答

8
我是这样做的:
> 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)

4

如果您将通常的操作符括在括号中,您将看到它们的类型:

> (+);;
val it : (int -> int -> int) = <fun:it@4-5>

不幸的是,这限制了操作符的类型只能是一个特定的类型-F#交互式不打印带约束的多态定义。您可以使用Stephen建议的解决方法(并定义一个新的inline函数)来查看。

它不能用于::的原因是因为::实际上是一种特殊的语法结构(直接在F#规范中定义)。


0

这篇文章有些老了,但我正在学习F#并且也想搞清楚这个问题。

查看F#规范第32页,我们可以看到符号关键字在F#中也有编译名称。对于::的等效编译名称是op_ColonColon,它实际上接受元组:

> op_ColonColon;;
val it : arg0:'a * arg1:'a list -> 'a list = <fun:clo@22-5>`

使用::来定义内联函数会给我们一个柯里化的cons函数,这是令人误解的,我认为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接