无法从 Haskell 中的 GADT 表达式类型创建动态

Unable to create Dynamic from GADT Expression Type in Haskell

我在 Haskell 中有以下内容(作为最小示例)。

{-# LANGUAGE GADTs #-}
import Data.Dynamic    

data Expr a where
  Lift  :: (Show a) => a -> Expr a --Lift some type into Expr
  Lam   :: (Expr a -> Expr b) -> Expr (a -> b)
  Const :: Expr a -> Expr b -> Expr a

当我尝试从以下内容创建 Dynamic 时,出现错误,我不确定如何更正。

--This is the code
toDyn $ (Lam (Const (Lift 1)))
-- This is the error
-- • No instance for (Typeable b0) arising from a use of ‘toDyn’
-- • In the expression: toDyn (Lam (Const (Lift 1)))
--   In an equation for ‘it’: it = toDyn (Lam (Const (Lift 1)))

有什么办法解决这个问题吗?其他构造函数都工作正常(我的实际程序有 100 多个!)但是 Const 真的给我带来麻烦!

错误是 Const 的第二个参数的类型,即被丢弃的那个,需要是 Typeable。但它是一个完全通用的类型变量,没有 Typeable 约束。如果你写类似

toDyn (Const (Lift 1) :: Expr Int -> Expr Int)

toDyn (Lam (Const (Lift 1) :: Expr Int -> Expr Int))

两者都有效。