Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
lambda表达式中的Haskell型签名_Haskell - Fatal编程技术网

lambda表达式中的Haskell型签名

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附带允许直接以模式写入签名,这

假设我的程序中有一个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::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支持的许多语法扩展。