F#有没有一种打印表达式类型的方法?

7

我正在寻找与ghci类似的道德等价物:

Prelude> :t 1 + 2
1 + 2 :: Num a => a

6
默认情况下,它不是已经这样做了吗?例如,1;; 会产生 val it : int = 1 的结果。 - John Palmer
@JohnPalmer - 这很方便,但并不完全相同。考虑 (+),它将不会显示一个正确的通用类型签名。或者拿一个表达式 deleteDatabase() 来说,你可能想要在不执行它的情况下找到它的类型。 - kvb
2
@kvb 好吧,就deleteDatabase()而言,你仍然可以输入deleteDatabase;; - torbonde
1
@Carsten - 如果说它比Haskell更通用,因为操作数和返回类型的类型不需要匹配(例如,考虑 (+) System.DateTime.Now (System.TimeSpan.FromSeconds 1.0))。 - kvb
@Carsten - 你说得对,F#类型和表达式的.NET表示比F#级别的表示更粗糙,但我认为这并不重要。就像悬停在“+”上会出现工具提示val (+) : x:'T1 -> y:'T2 -> 'T3 (requires member (+))一样,我们可以轻松构建一个REPL指令,在给定表达式时产生相同的信息(这似乎是OP所要求的)。然而,在REPL中输入裸表达式通常不会产生该结果,因此它并不是(在所有情况下)替换此功能的合适选择。 - kvb
显示剩余4条评论
1个回答

3
在F#交互式环境中,每次执行后都会得到以下结果:
> (+);;
val it : (int -> int -> int) = <fun:it@1>
> 1 + 2;;
val it : int = 3
> printfn "Hi";;
Hi
val it : unit = ()

正如我在评论中所说的,这是一种有用的技术,但并不能真正取代Haskell的特性,因为表达式的求值可能会引起副作用,并且值限制可能会使结果比在其他情况下表达式本身更不通用(甚至可能使某些表达式无效作为顶级值)。 - kvb
虽然它似乎是唯一的“道德等价物”,但我将使其得到解答。谢谢!更重要的是,它仍然可以与类似printfn的具有副作用的代码一起使用。 - Steven Shaw

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