我目前正在Haskell中编写一种编程语言。这种编程语言类似于Factor,是一种基于堆栈的串联语言。然而,在走了很远之后,我碰到了一堵砖墙:我有一个类型的Data.Map:
Map.Map String ([YodaVal] -> YodaVal, Int)
但我需要存储在map中的函数将map作为参数,因此我可以在递归时保留环境,也可以允许递归函数定义,以及Haskell的递归定义 - >尤达的功能。但是,类型将如下所示:
type Env = Map.Map String ([YodaVal] -> Env -> [YodaVal] -> YodaVal, Int)
当然扩展到:
Map.Map String ([YodaVal] -> Map.Map String ... -> [YodaVal] -> YodaVal, Int)
答案 0 :(得分:6)
您可以使用newtype
来描述无限类型:
newtype Env = Env {getEnv :: Map String ([Val] -> Env -> [Val] -> Val, Int))}
这将是类型检查,运行时表示就好像没有包装器一样。