lambda表达式中的Haskell类型签名

Mar*_*eni 13 haskell

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

\x -> f $ x + 1
Run Code Online (Sandbox Code Playgroud)

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

-- WARNING: bad code
\x::Int -> f $ x + 1
Run Code Online (Sandbox Code Playgroud)

C. *_*ann 13

你可以改写\x -> f $ (x::Int) + 1.或者,也许更具可读性\x -> f (x + 1 :: Int).请注意,类型签名通常包含左边的所有内容,最左边是语法意义,这与lambdas向右延伸相反.

GHC扩展ScopedTypeVariables允许直接以模式编写签名,这将允许\(x::Int) -> f $ x + 1.但是这个扩展还增加了一些你可能不想担心的其他东西; 我不会仅仅为了语法准确而将其打开.

  • 哈哈,是的 TH不理解GHC支持的一些语法扩展,唉. (2认同)

Gab*_*lez 11

我想通过注意到你不需要添加到CAMcCann的答案 ScopedTypeVariables.即使你从不使用变量,你仍然可以做到:

\x -> let _ = (x :: T) in someExpressionThatDoesNotUseX
Run Code Online (Sandbox Code Playgroud)