我目前正在用 Haskell 编写一种编程语言。这种编程语言类似于 Factor,是一种基于堆栈的串联语言。然而,在走得很远之后,我碰到了一堵砖墙:我有一个 Data.Map 类型:Map.Map String ([YodaVal] -> YodaVal, Int)
但是我需要存储在映射中的函数将映射作为参数,因此我可以在递归时保留环境,并且还可能允许递归函数定义,以及 Haskell --> Yoda 函数的递归定义。但是,该类型将如下所示:type Env = Map.Map String ([YodaVal] -> Env -> [YodaVal] -> YodaVal, Int)
当然扩展为:Map.Map String ([YodaVal] -> Map.Map String ... -> [YodaVal] -> YodaVal, Int)
最佳答案
您可以使用 newtype
描述无限类型:
newtype Env = Env {getEnv :: Map String ([Val] -> Env -> [Val] -> Val, Int))}
这将进行类型检查,并且运行时表示就好像没有包装器一样。
关于Haskell - 采用相同映射的函数映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32335441/