假设我在程序中有一个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表达式相反,lambda表达式扩展到右侧。顺便提一下,GHC扩展 ScopedTypeVariables
允许在模式中直接编写签名,这将允许 \(x::Int) -> f $ x + 1
。但是该扩展还添加了其他您可能不想担心的东西;我不会仅为了语法上的美感而打开它。
ScopedTypeVariables
。即使您从未使用过该变量,仍然可以执行以下操作:\x -> let _ = (x :: T) in someExpressionThatDoesNotUseX
x
的推断类型(Num a => a
)相比于Int
,有哪些方面是不够安全的呢? - sepp2k