无法在Haskell中从GADT表达式创建动态

时间:2017-12-06 21:09:35

标签: haskell dynamic gadt

我在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

当我尝试从下面创建一个动态时,我收到一个错误,我不确定如何纠正。

--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真的给了我麻烦!

1 个答案:

答案 0 :(得分:1)

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

这样的东西
toDyn (Const (Lift 1) :: Expr Int -> Expr Int)

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

都工作。