我在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真的给了我麻烦!
答案 0 :(得分:1)
错误是说Const
的第二个参数的类型,即被抛弃的参数,需要为Typeable
。但它是一个完全通用的类型变量,没有Typeable约束。如果你写了像
toDyn (Const (Lift 1) :: Expr Int -> Expr Int)
或
toDyn (Lam (Const (Lift 1) :: Expr Int -> Expr Int))
都工作。