将约束添加到实例时出现奇怪的行为

我正在使用语法库来处理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

我可以定义一个没有Const :<: dom约束的Foo实例,但我不知道如何在没有这个约束的情况下编译bar的任何方法(如果我离开bar的限制,GHC建议IncoherentInstances )。 barfoo之间有什么不同,允许我不使用foo约束?

问题2

尽管我可以在没有约束的情况下定义Foo实例,但在上面的代码中运行main打印“FAIL”。 但是,如果我在实例中添加(取消注释)约束Const :<: dom ,则main打印“PASS”。 Haskell机制能够添加不必要的约束并改变行为? 在这个例子中发生了什么特别的事情导致这种行为? 我怀疑它可能与句法库中的重叠/不可判定/不连贯的实例有关。 (注意: bar总是打印“PASS”。)

链接地址: http://www.djcxy.com/p/43259.html

上一篇: Strange behavior when adding constraint to instance

下一篇: When are guard expressions appropriate?