一个设置隐式参数上下文

时间:2017-01-15 13:39:01

标签: haskell implicit-parameters

我一直在使用隐式参数,我有时会觉得这些参数很有用,但尝试执行类似下面的代码(不会编译)

{-# LANGUAGE ImplicitParams #-}

main = print (f z)

f g =
  let 
    ?x = 42
    ?y = 5
  in
    g

z :: (?x :: Int) => Int
z = ?x

我想要的基本上是一个函数f,它使用" context"运行给定的函数。在上述情况下,f zz?x = 42一起运行,在这种情况下自然会返回42,因此该程序应打印42。但是我得到了错误:

• Unbound implicit parameter ?x::Int arising from a use of ‘z’
• In the first argument of ‘f’, namely ‘z’
  In the first argument of ‘print’, namely ‘(f z)’
  In the expression: print (f z)

这是因为z首次使用main时没有上下文,即使f正在提供上下文。

我尝试这样做的原因是因为我有许多使用隐式参数的函数,以及GADT具有不同但相似的实现选项。编写一个从每个可能的GADT构造函数中提取适当的隐式参数的函数是相对微不足道的,但是我想用这些隐式参数应用一个函数。

这种方法(编译)会很好,或者另外一种允许我轻松为各种函数设置隐式参数上下文的方法也没关系。

1 个答案:

答案 0 :(得分:2)

您需要f的显式类型注释。 GHC无法推断出正确的类型。

{-# LANGUAGE ImplicitParams, Rank2Types #-}

main = print (f z)

f :: ((?x :: Int, ?y :: Int) => a) -> a
f g =
  let 
    ?x = 42
    ?y = 5
  in
    g

z :: (?x :: Int) => Int
z = ?x