假设我的程序中有一个 lambda 表达式,例如:
\x -> f $ x + 1
我想为类型安全指定 x 必须是整数。就像是:
-- WARNING: bad code
\x::Int -> f $ x + 1
假设我的程序中有一个 lambda 表达式,例如:
\x -> f $ x + 1
我想为类型安全指定 x 必须是整数。就像是:
-- WARNING: bad code
\x::Int -> f $ x + 1
你可以改写\x -> f $ (x::Int) + 1
。或者,也许更具可读性,\x -> f (x + 1 :: Int)
. 请注意,类型签名通常包含其左侧的所有内容,在语法意义上的最左侧,这与延伸到右侧的 lambda 表达式相反。
GHC 扩展ScopedTypeVariables
顺便允许直接在模式中编写签名,这将允许\(x::Int) -> f $ x + 1
. 但是该扩展还添加了许多您可能不想担心的其他东西;我不会仅仅为了语法上的好处而打开它。
我想通过指出您不需要 ScopedTypeVariables
. 即使您从不使用该变量,您仍然可以执行以下操作:
\x -> let _ = (x :: T) in someExpressionThatDoesNotUseX