繁体   English   中英

Wadler 中具有类型约束的数据类型 - 函数式编程论文的精华,

[英]Data type with type constraint in Wadler - Essence of functional programming paper,

在 Phil Wadler 的论文:函数式编程的本质,Wadler 用一个简单的解释器程序描述了 Monads 的应用。 程序如下图所示:

项可以是变量、常量、总和、lambda 表达式或应用程序。 以下将作为测试数据。

 term0 = (App (Lam "x" (Add (Var "x") (Var "x"))) (Add (Con 10) (Con 11)))

就我们的目的而言,monad 是一个三元组(M,unitM,bindM)由一个类型构造函数M和一对多态函数组成。

 unitM :: a -> M a bindM :: M a -> (a -> M b) -> M b

然后解释器程序被描述为:

type Name = String

data Value = Wrong
           | Num Int
           | Fun (Value -> M Value)

我没有看到M Value是如何包含在这里的。 我的理解是 Haskell 不允许对数据类型构造函数进行类型约束?

更多详情:完整的程序如下:

type Name = String
data Term = Var Name
          | Con Int
          | Add Term Term
          | Lam Name Term
          | App Term Term
data Value = Wrong
           | Num Int
           | Fun (Value -> M Value)
type Environment = [(Name, Value)]
interp :: Term -> Environment -> M Value
interp (Var x) e = lookup x e
interp (Con i) e = unitM (Num i)
interp (Add u v) e = interp u e `bindM` (\a ->
                                            interp v e `bindM` (\b ->
                                                                  add a b))
interp (Lam x v) e = unitM (Fun (\a -> interp v ((x,a):e)))
interp (App t u) e = interp t e `bindM` (\f ->
                                             interp u e `bindM` (\a ->
                                                                     apply f a))

lookup :: Name -> Environment -> M Value
lookup x [] = unitM Wrong
lookup x ((y,b):e) = if x==y then unitM b else lookup x e

add :: Value -> Value -> M Value
add (Num i) (Num j) = unitM (Num (i+j))
add a b = unitM Wrong

apply :: Value -> Value -> M Value
apply (Fun k) a = k a
apply f a = unitM Wrong

可以看出interp (Lam xv) e = unitM (Fun (\\a -> interp v ((x,a):e)))需要定义data Value = ... | Func (Value -> M Value) data Value = ... | Func (Value -> M Value)

我试图通过使用data Value = ... | Func (Value -> Value)来实现interp (Lam xv) data Value = ... | Func (Value -> Value) ,但对我来说似乎不可能。

M 不是约束,它是一个类型构造函数。 所以写M Value类似于[Value]Maybe Value等。一个约束类似于Monad m => m Value ,其中 m 是一个类型变量,而不是一个类型构造函数,而Monad m是约束(Monad 是一个类型类)。

在这篇论文中,没有给出类型M value的定义,后来表明你可以给它不同的定义(定义将涉及定义data M v = ...以及函数bindMunitM )。

编辑:如果你想有一个约束,你可以像这样改变值的定义:

data Value m = Wrong
             | Num Int
             | Fun (Value m -> m (Value m))

然后对函数类型进行约束,例如:

interp :: Monad m => Term -> Environment -> m (Value m)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM