lambda表达式中的Haskell型签名
假设我的程序中有一个lambda表达式,如:lambda表达式中的Haskell型签名,haskell,Haskell,假设我的程序中有一个lambda表达式,如: \x -> f $ x + 1 我想为类型安全性指定x必须是整数。比如: -- WARNING: bad code \x::Int -> f $ x + 1 您只需编写\x->f$(x::Int)+1。或者,也许更容易阅读,\x->f(x+1::Int)。请注意,类型签名通常包含其左侧的所有内容,只要在语法意义上是最左侧的,这与lambdas向右侧扩展相反 GHC扩展ScopedTypeVariables附带允许直接以模式写入签名,这
\x -> f $ x + 1
我想为类型安全性指定x必须是整数。比如:
-- WARNING: bad code
\x::Int -> f $ x + 1
您只需编写
\x->f$(x::Int)+1
。或者,也许更容易阅读,\x->f(x+1::Int)
。请注意,类型签名通常包含其左侧的所有内容,只要在语法意义上是最左侧的,这与lambdas向右侧扩展相反
GHC扩展
ScopedTypeVariables
附带允许直接以模式写入签名,这将允许\(x::Int)->f$x+1
。但是这个扩展也增加了一些你可能不想担心的东西;我不会仅仅为了语法上的精确性而打开它。我想补充C.a.McCann的答案,指出您不需要ScopedTypeVariables
。即使从不使用该变量,也可以始终执行以下操作:
\x -> let _ = (x :: T) in someExpressionThatDoesNotUseX
(\x->f$(x::Int)+1)您所说的“用于类型安全”到底是什么意思?
x
(Num a=>a
)的推断类型以何种方式比Int
更不安全?@sepp2k我正在编写的实际代码确实显示了x,并且可以显示很多内容,但我只希望在x是某种类型(如Int)时编译此lambda。问题中的代码不是实际代码,这是提问的最短方式。谢谢,回答得很好。我实际上在模板Haskell中使用了这个,仅供参考,关于第二个选项,GHC 7.4.1说“模板Haskell尚未处理模式中的类型签名”。哈哈,是的。唉,TH不理解GHC支持的许多语法扩展。