GHC 明确强制要求

GHC make explicit forall mandatory

语言扩展 ExplicitForall 使绑定类型变量成为可能但不是必需的 forall

例如下面的程序编译

{-# LANGUAGE ExplicitForAll #-}

-- cps1.hs

-- non-cps definition of add
add :: Int -> Int -> Int
add x y = x + y

-- cps definition of add
add_cps :: forall r . Int -> Int -> (Int -> r) -> r
add_cps x y k = k (add x y)

但是,以下没有显式 r 量词的程序也可以编译。

{-# LANGUAGE ExplicitForAll #-}

-- cps2.hs

-- non-cps definition of add
add :: Int -> Int -> Int
add x y = x + y

-- cps definition of add
add_cps :: Int -> Int -> (Int -> r) -> r
add_cps x y k = k (add x y)

是否有某种语言扩展或编译器标志的组合可以使第二个程序无法编译?

不,GHC 目前没有相应的工具。