向实例添加约束时的奇怪行为

时间:2014-11-20 23:35:27

标签: haskell ghc

我正在使用syntactic库来处理AST。我有一些奇怪的行为,我不是正在发生的事情。

{-# LANGUAGE TypeOperators, GADTs, FlexibleInstances,
    FlexibleContexts, UndecidableInstances #-}
module Foo where

import Data.Syntactic
import Data.Syntactic.Functional

data Const a where Const :: Const (Full a)
instance Render Const where renderSym Const = "const"

main :: ASTF Const Int
main = foo $ inj Const

class Foo dom where
  foo :: ASTF dom a -> ASTF dom a

instance --(Const :<: dom) => 
    Foo dom where
  foo node | Just Const <- prj node = error "PASS"
  foo _ = error "FAIL"

bar :: (Const :<: dom) => ASTF dom a -> ASTF dom a
bar node | Just Const <- prj node = error "PASS"
bar _ = error "FAIL"

问题1

我可以在没有约束Foo的情况下定义Const :<: dom实例,但我不知道在没有该约束的情况下使bar编译的任何方法(如果我将约束从IncoherentInstances移开,GHC建议barbarfoo之间有什么不同,允许我不使用foo的约束?

问题2

虽然我可以定义没有约束的Foo实例,但在上面的代码中运行main会打印“FAIL”。但是,如果我在实例中添加(取消注释)约束Const :<: dommain将打印“PASS”。什么Haskell机器可以添加不必要的约束并改变行为?在这个例子中具体发生了什么导致这种行为?我怀疑它可能与Syntactic库中的重叠/不可判断/不连贯的实例有关。 (注意:bar始终打印“PASS”。)

0 个答案:

没有答案