无法从 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))
两者都有效。
我在 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))
两者都有效。