[英]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 = ...
以及函數bindM
和unitM
)。
編輯:如果你想有一個約束,你可以像這樣改變值的定義:
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.