这是一个场景:我写了一些带有类型签名的代码,GHC抱怨不能为一些x
和y
推导x ~ y。你通常可以抛弃GHC,简单地将同构添加到函数约束中,但这是一个坏主意,原因如下:
我刚花了几个小时处理三号病例。我正在使用syntactic-2.0
,并试图定义一个与领域无关的share
版本,类似于在NanoFeldspar.hs
中定义的版本。
我有这个:
{-# LANGUAGE GADTs, FlexibleContexts, TypeOperators #-}
import Data.Syntactic
-- Based on NanoFeldspar.hs
data Let a where
Let :: Let (a :-> (a -> b) :-> Full b)
share :: (Let :<: sup,
Domain a ~ sup,
Domain b ~ sup,
SyntacticN (a -> (a -> b) -> b) fi)
=> a -> (a -> b) -> a
share = sugarSym Let
GHC could not deduce (Internal a) ~ (Internal b)
,这当然不是我想要的。所以,要么是我写了一些我不打算写的代码(这需要约束),要么是GHC因为我写的其他一些约束而想要那个约束。
结果是,我需要将(Syntactic a, Syntactic b, Syntactic (a->b))
添加到约束列表中,其中没有一个包含(Internal a) ~ (Internal b)
。我基本上是偶然发现了正确的约束条件;我仍然没有一个系统的方法来找到它们。
我的问题是:
Internal a ~ Internal b
,那么GHC从哪里拉出来的呢?