首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建一个映射usign、GADT和Data.Map的类型化玩具语言环境?

如何创建一个映射usign、GADT和Data.Map的类型化玩具语言环境?
EN

Stack Overflow用户
提问于 2021-08-26 02:38:24
回答 1查看 74关注 0票数 0

我在和Haskell玩,我的想法是在GADT的帮助下创建一种玩具语言。解释器通常有一个将变量名映射到值的环境映射。

在我的玩具语言中,基本上有两种类型,例如用I 10B True表示的int和bool。

问题是我不能创建同时包含这两个元素的地图,以下是我的代码

代码语言:javascript
复制
{-# LANGUAGE GADTs, RankNTypes #-}

module Foo where

import qualified Data.Map as M
import Data.Maybe

data Expr a where
  V :: Char -> Expr a
  B :: Bool -> Expr Bool
  I :: Int -> Expr Int
  If :: Expr Bool -> Expr a -> Expr a -> Expr a

type Env a = M.Map Char (Expr a)

env = M.fromList [('x', B True), ('y', I 10)]
-- Error here                      ----^^^^
-- [typecheck -Wdeferred-type-errors] [E] • Couldn't match type ‘Int’ with ‘Bool’
--   Expected type: Expr Bool
--     Actual type: Expr Int
-- • In the expression: I 10
--   In the expression: ('y', I 10)
--   In the first argument of ‘M.fromList’, namely
--     ‘[('x', B True), ('y', I 10)]’

如何创建这样的映射?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-26 03:02:17

对于如此小的类型集合,我将使用以下其中之一:

代码语言:javascript
复制
type Env = Map Variable (Either (Expr Int) (Expr Bool))
type Env = (Map Variable (Expr Int), Map Variable (Expr Bool))

关于是否要为每种类型使用单独的命名空间的...depending。当有更多类型可用时,我会使用这些类型之一:

代码语言:javascript
复制
data UntypedExpr = forall a. UE (TypeRep a) (Expr a)
type Env = Map Variable UntypedExpr
-- OR
newtype SingleTypeEnv a = STE (Map Variable (Expr a))
type Env = TypeRepMap SingleTypeEnv

...again取决于是否要为每种类型使用单独的命名空间。

TypeRep来自基本包(或者您可以编写一些新的GADT,它更针对您的EDSL的类型),而TypeRepMap来自typerep-map

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68931850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档