15

假设我的程序中有一个 lambda 表达式,例如:

\x -> f $ x + 1

我想为类型安全指定 x 必须是整数。就像是:

-- WARNING: bad code
\x::Int -> f $ x + 1
4

2 回答 2

17

你可以改写\x -> f $ (x::Int) + 1。或者,也许更具可读性,\x -> f (x + 1 :: Int). 请注意,类型签名通常包含其左侧的所有内容,在语法意义上的最左侧,这与延伸到右侧的 lambda 表达式相反。

GHC 扩展ScopedTypeVariables顺便允许直接在模式中编写签名,这将允许\(x::Int) -> f $ x + 1. 但是该扩展还添加了许多您可能不想担心的其他东西;我不会仅仅为了语法上的好处而打开它。

于 2013-01-26T19:34:56.633 回答
13

我想通过指出您不需要 ScopedTypeVariables. 即使您从不使用该变量,您仍然可以执行以下操作:

\x -> let _ = (x :: T) in someExpressionThatDoesNotUseX
于 2013-01-26T21:20:13.687 回答