簡體   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