代码之家  ›  专栏  ›  技术社区  ›  Siddharth Bhat

秩2约束规划/约束蕴涵

  •  1
  • Siddharth Bhat  · 技术社区  · 7 年前
    import Data.Constraint
    
    reify :: (c' :- c) -> (c => a) -> (c' => a)
    reify cons f = case cons of Sub d -> case d of Dict -> f
    

    使用 reify c c' 证明 c' .

    现在,我想要一个 Rank2 这方面的变体:

    -- reify2 Rank2's reify
    reify2 :: (forall r1. c' r1 :- c r1) -> 
              (forall r2. c r2 => a) -> 
              (forall r3. c' r3 => a)
    reify2 cons f = ???
    

    1 回复  |  直到 7 年前
        1
  •  2
  •   Li-yao Xia    7 年前

    可以使用以下方法消除歧义: ScopedTypeVariables+TypeApplications reify2 ,将类型参数放在第一位以将其放入范围。

    {-# LANGUAGE AllowAmbiguousTypes, RankNTypes, ConstraintKinds, GADTs, ScopedTypeVariables, TypeApplications, TypeOperators #-}
    
    data Dict c where
      Dict :: c => Dict c
    
    data c :- d where
      Sub :: (c => Dict d) -> c :- d
    
    reify2 :: forall r3 c c' a. c' r3 =>
              (forall r1. c' r1 :- c r1) ->
              (forall r2. c r2 => a) ->
              a
    reify2 cons f =
      case cons @r3 of
        Sub Dict -> f @r3