2

我一直在使用隐式参数,有时我发现这些参数很有用,但试图做一些类似下面的代码(不能编译)

{-# LANGUAGE ImplicitParams #-}

main = print (f z)

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

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

我想要的基本上是一个f使用“上下文”运行给定函数的函数。在上述情况下,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构造函数中提取适当的隐式参数的函数相对简单,但是我想应用一个带有这些隐式参数的函数。

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

4

1 回答 1

3

您需要为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
于 2017-01-15T13:46:21.590 回答